不知道为什么没有将二叉树中的元素输出,希望有人能教一下

程序目的是为了实现线索二叉树的中序遍历
不知道为什么没有将二叉树中的元素输出,希望有人帮忙改正一下

#include
#include

typedef struct BiTNode
{
    char data;
    struct BiTNode* lchild, * rchild;
    int ltag, rtag;
}BiTNode,*BiTree;

BiTNode* pre=NULL;

void GreateBiTree(BiTree& T)
{
    char ch;
    scanf_s("%c", &ch);
    if (ch == '#')
    {
        T = NULL;
    }
    else {
        T = (BiTNode*)malloc(sizeof(BiTNode));
        T->data = ch;
        GreateBiTree(T->lchild);
        GreateBiTree(T->rchild);
    }
}

void InThread(BiTree &T)
{
    if (T != NULL)
    {
        InThread(T->lchild);
        if (T->lchild == NULL)
        {
            T->lchild = pre;
            T->ltag = 1;
        }
        else {
            T->ltag = 0;
        }

        if (pre != NULL && pre->rchild == NULL)
        {
            pre->rchild = T;
            pre->rtag = 1;
        }
        else {
            pre->rtag = 0;
        }
        pre = T;
        InThread(T->rchild);
    }
}

void InThreadOrder(BiTree T)
{
    BiTNode* p;
    p = T->lchild;
    while (p != NULL)
    {
        while(p->ltag==0)
        {
            p = p->lchild;
        }
        printf("%c ", p->data);
        while (p != NULL&&p->rtag == 1)
        {
            p = p->rchild;
            printf("%c ",p->data);
        }
        p = p->rchild;
    }
}

int main()
{
    BiTree Tree;
    GreateBiTree(Tree);
    InThread(Tree);
    InThreadOrder(Tree);
}

img

没有通过修改节点的指针实现线索化,而是只利用标记变量ltag和rtag来记录节点是否存在左右线索。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7517842
  • 这篇博客你也可以参考下:普通的二叉树和完全二叉树的创建方法
  • 除此之外, 这篇博客: 已知一颗二叉树的中序遍历和后序遍历构建二叉树中的 一、算法思路 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 前提条件:所构建二叉树中的每一项均不相等,给出所有节点的个数

    1、后序遍历中的最后一项为当前子树的根节点

    2、通过后序遍历得到根节点的值后找到根节点的值在中序遍历中的位置,根节点的两边分别对应其左子树和右子树的中序遍历

    3、通过中序遍历确立当前根节点左右子树的个数,即可在后序遍历数组中分出左右子树的后序遍历(因为后序遍历顺序为左子树->右子树->根节点)

    4、递归构建二叉树:
    (1)若传入的遍历数组为空(size == 0),返回null
    (2)根据当前这棵(子)树建立当前根节点,并分出左子树与右子树的中序、后序遍历
    (3)当前根节点的左子树与右子树通过获得的左右子树的中序、后序遍历递归构建

  • 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 平衡二叉树的定义和不平衡原因分析小节, 巩固相关知识点