知识点
- 前序遍历第一个节点为根节点
- 找后继节点
- 左指针不为空且不是线索:就是后继节点
- 左指针空或为线索且右指针不为空:右指针就是后继节点,无论他是不是线索
- 找前驱节点
代码
前序线索化,与中序类似,只写出核心代码
void preThread(tNode *p, tNode *&pre)
{
if (p != NULL)
{
if (p->lChild == NULL)
{
p->lChild = pre;
p->ltag = 1;
}
if (pre && pre->rChild == NULL)
{
pre->rChild = p;
pre->rtag = 1;
}
pre = p;
// 注意这里与中序有区别,只有左右指针不是线索才能递归,不然有可能形成环,导致死循环
if (p->ltag == 0)
preThread(p->lChild, pre);
if (p->rtag == 0)
preThead(p->rChild, pre);
}
}
执行中序遍历
void preorder(node *root)
{
if (root)
{
node *p = root;
while (p)
{
// 左指针不是线索且不为空,左指针为后继
while (p->ltag == 0)
{
cout << p->data << " ";
p - p->lChild;
}
cout << p->data << " ";
p = p->rChild; // 左指针为空,无论是否为线索,后继都是右指针
}
}
}