程序目的是为了实现线索二叉树的中序遍历
不知道为什么没有将二叉树中的元素输出,希望有人帮忙改正一下
#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);
}
没有通过修改节点的指针实现线索化,而是只利用标记变量ltag和rtag来记录节点是否存在左右线索。
前提条件:所构建二叉树中的每一项均不相等,给出所有节点的个数
1、后序遍历中的最后一项为当前子树的根节点
2、通过后序遍历得到根节点的值后找到根节点的值在中序遍历中的位置,根节点的两边分别对应其左子树和右子树的中序遍历
3、通过中序遍历确立当前根节点左右子树的个数,即可在后序遍历数组中分出左右子树的后序遍历(因为后序遍历顺序为左子树->右子树->根节点)
4、递归构建二叉树:
(1)若传入的遍历数组为空(size == 0),返回null
(2)根据当前这棵(子)树建立当前根节点,并分出左子树与右子树的中序、后序遍历
(3)当前根节点的左子树与右子树通过获得的左右子树的中序、后序遍历递归构建