版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39956356/article/details/80141837
二叉树的(先,中,后)序的建树
核心:递归与访问顺序
(1):访问顺序
(2):反复递归调用
先序建树:按照反访问顺序
//先序创建树
Status CreatPreBiThreadTree(BiThrTree &T, char TreeArray[])
{
char ch = TreeArray[N];
N++;
if ('$' == ch) {
T = NULL;
return 0;
}
else{
if (!(T = (BiThrNode *)malloc(sizeof(BiThrNode))))
return OVERFLOW;
T->data = ch;
printf("%5c", T->data);
T->LTag = Link;
CreatPreBiThreadTree(T->lchild, TreeArray);
T->RTag = Link;
CreatPreBiThreadTree(T->rchild, TreeArray);
}
return OK;
}
中序建树:按照反访问顺序
//中序创建树
Status CreatInBiThreadTree(BiThrTree &T, char TreeArray[])
{
char ch = TreeArray[N2];
N2++;
if ('$' == ch) {
T = NULL;
return 0;
}
else {
if (!(T = (BiThrTree)malloc(sizeof(BiThrNode))))
return OVERFLOW;
T->LTag = Link;
CreatInBiThreadTree(T->lchild, TreeArray);
T->data = ch;
printf("%5c", T->data);
T->RTag = Link;
CreatInBiThreadTree(T->rchild, TreeArray);
}
return OK;
}
后序建树:按照反访问顺序,后序遍历需要知道双亲节点,所以要用带双亲节点的三叉料表
//后序创建树
Status CreatPostBiThreadTree(BiThrTree &T, char TreeArray[], BiThrTree &parent)
{
char ch = TreeArray[N3];
N3++;
if ('$' == ch) {
T = NULL;
return 0;
}
else {
if (!(T = (BiThrNode *)malloc(sizeof(BiThrNode))))
return OVERFLOW;
T->Parent = parent;
T->LTag = Link;
CreatPostBiThreadTree(T->lchild, TreeArray, T);
T->RTag = Link;
CreatPostBiThreadTree(T->rchild, TreeArray, T);
T->data = ch;
printf("%5c", T->data);
}
return OK;
}
注意:接下来的两篇文章重点就是二叉数的三种线索化和对应的遍历,由于篇幅的问题及处理方式的不同,分成了两章内容
1:(先序,中序)线索化及遍历,这两个相识度很高,所以放在了一起。
2: 后序线索化及遍历,要使用带双亲的三叉链表,单独写。
(先序,中序)线索化及遍历:
https://blog.csdn.net/weixin_39956356/article/details/80142461
后序线索化及遍历:
https://blog.csdn.net/weixin_39956356/article/details/80144113
线索二叉树的基本知识:
https://blog.csdn.net/weixin_39956356/article/details/80141980