二叉树用二叉链存储问题最好在3小时内回答

二叉树用二叉链存储,链接时用叶子结点的rchild 域存放指针。请设计一个算法完成①对一棵二叉树加线索(中序);②把二叉树的叶子结点按从左到右的顺序连成一个单链表。③统计二叉树中0到2度结点个数。

中序线索化:

typedef struct tNode{
    char data;
    int leftThread;
    struct tNode *leftChild;
    struct tNode *rightChild;
    int rightThread;
}ThreadBiNode;

typedef struct
{
    ThreadBiNode *root;
    ThreadBiNode *current;
    int nextComplete;
}ThreadBiTree;

void InThread(ThreadBiNode*current, ThreadBiNode** pre)
{

    if (current != NULL)
    {
        InThread(current->leftChild, pre);
        
        if (current->leftChild == NULL)
        {
            current->leftThread = 1;
            current->leftChild = *pre;
        }
        else current->leftThread = 0;
        if (current->rightChild != NULL)
            current->rightThread = 0;
        else
            current->rightThread = 1;
        if ((*pre)->rightChild == NULL)
        {
            (*pre)->rightThread = 1;
            (*pre)->rightChild = current;
        }
        else
            current->rightThread = 0;

        *pre = current;
        InThread(current->rightChild, pre);
    }
}


void CreateInThread(ThreadBiNode** root)
{
    ThreadBiNode*t = *root;
    ThreadBiNode* current, *pre = *root;
    *root = (ThreadBiNode*)malloc(sizeof(BiTreeNode));
    if(t==NULL)
    {
        (*root)->leftThread = 0;
        (*root)->rightThread =1;
        (*root)->leftChild = *root;
        (*root)->rightChild = *root;
        
    }
    else
    {
        current = t;
        (*root)->leftChild = t;
        (*root)->leftThread = 0;
        InThread(current, &pre);
        pre->rightChild = *root;
        pre->rightThread = 1;
        (*root)->rightChild = pre;
        (*root)->rightThread = 1;

    }
}

ThreadBiNode* GetTreeNode(char item, ThreadBiNode* left, ThreadBiNode* right)
{
    ThreadBiNode* p = (ThreadBiNode*)malloc(sizeof(BiTreeNode));
    p->data = item;
    p->leftChild = left;
    p->rightChild = right;
    return p;
}

void MakeCharTree(ThreadBiNode**root)
{
    ThreadBiNode*b, *c, *d, *e, *f, *g;
    g = GetTreeNode('G', NULL, NULL);
    d = GetTreeNode('D', NULL, g);
    b = GetTreeNode('B', d, NULL);
    e = GetTreeNode('E', NULL, NULL);
    f= GetTreeNode('F', NULL, NULL);
    c = GetTreeNode('C', e, f);
    *root = GetTreeNode('A', b, c);
}


void ThreadInitiate(ThreadBiTree *tree, ThreadBiNode *root)
{
    tree->root = root;
    tree->current = root;
    if (root == NULL)
        tree->nextComplete = 1;
    else
            tree->nextComplete = 0;
}
void First(ThreadBiTree *tree)
//定位在中序线索二叉树的第一个结点
{
    tree->current = tree->root;             //定位根结点
    while (tree->current->leftThread == 0//找到最左子树结点
        tree->current = tree->current->leftChild;

    if (tree->current == tree->roottree->nextComplete = 1;
    else   tree->nextComplete = 0;
}

void Next(ThreadBiTree *tree)
//定位在中序线索二叉树当前结点的下一个结点
{
    ThreadBiNode *p = tree->current->rightChild;
    if (tree->nextComplete == 1)    return;
    if (tree->current->rightThread == 0)        //若有右孩子结点
        while (p->leftThread == 0) p = p->leftChild;      //找到最左子树结点
    tree->current = p;
    if (tree->current == tree->root) tree->nextComplete = 1;
}

int EndOfNext(ThreadBiTree *tree)
//判断是否已到中序线索二叉树的最后一个结点
{
    return tree->nextComplete;
}

void main_thread(void)
{
    ThreadBiNode *root;
    ThreadBiTree tree;

    MakeCharTree(&root);
    CreateInThread(&root);

    printf("二叉树中序正向遍历序列为:");
    ThreadInitiate(&tree, root);         //循环初始化        
    for (First(&tree); !EndOfNext(&tree); Next(&tree))
        printf("%c  ", tree.current->data);
}

帮你找了一些相关方向以作参考:
http://t.csdn.cn/enpkY

二叉树的遍历和线索二叉树
https://blog.csdn.net/qq_42030496/article/details/108585478

参考一下

二叉树的二叉链表存储结构及C++实现 - ~君莫笑~ - 博客园 前言:存储二叉树的关键是如何表示结点之间的逻辑关系,也就是双亲和孩子之间的关系。在具体应用中,可能要求从任一结点能直接访问到它的孩子。 一、二叉链表 二叉树一般多采用二叉链表(binary linke https://www.cnblogs.com/smile233/p/8145760.html#:~:text=%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%80%E8%88%AC%E5%A4%9A%E9%87%87%E7%94%A8%E4%BA%8C%E5%8F%89%E9%93%BE%E8%A1%A8%EF%BC%88binary,linked%20list%EF%BC%89%E5%AD%98%E5%82%A8%EF%BC%8C%E5%85%B6%E5%9F%BA%E6%9C%AC%E6%80%9D%E6%83%B3%E6%98%AF%EF%BC%9A%E4%BB%A4%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%AF%8F%E4%B8%80%E4%B8%AA%E7%BB%93%E7%82%B9%E5%AF%B9%E5%BA%94%E4%B8%80%E4%B8%AA%E9%93%BE%E8%A1%A8%E7%BB%93%E7%82%B9%E9%93%BE%E8%A1%A8%E7%BB%93%E7%82%B9%E9%99%A4%E4%BA%86%E5%AD%98%E6%94%BE%E4%B8%8E%E4%BA%8C%E5%8F%89%E6%A0%91%E7%BB%93%E7%82%B9%E6%9C%89%E5%85%B3%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BF%A1%E6%81%AF%E5%A4%96%EF%BC%8C%E8%BF%98%E8%A6%81%E8%AE%BE%E7%BD%AE%E6%8C%87%E7%A4%BA%E5%B7%A6%E5%8F%B3%E5%AD%A9%E5%AD%90%E7%9A%84%E6%8C%87%E9%92%88%E3%80%82