线索二叉树的构造
常用的是中序线索二叉树。
寻找前驱结点:
- 若左指针为线索,则其指向结点为前驱结点。
- 若左指针为左孩子,则其左子树的最右侧结点为前驱结点。
寻找后继结点:
- 若右指针为线索,则其指向结点为后继结点。
- 若右指针为右孩子,则其右子树的最左侧结点为后继结点。
中序线索二叉树线索化
// p 为线索二叉树的根结点
// pre 为对应结点的前驱结点
void InThread(ThreadTree &p, ThreadTree &pre)
{
if (p != NULL)
{
InThread(p->lchild, pre);
if (p->lchild == NULL)
{
p->lchild = pre;
p->ltag = 1;
}
if (pre != NULL && pre->lchild == NULL)
{
p->rchild = p;
p->rtag = 1;
}
InThread(p->rchild, pre);
}
}
void CreateInThread(ThreadTree T)
{
ThreadTree pre = NULL;
if (T != NULL)
{
InThread(T, pre);
pre->rchild = NULL;
pre->rtag = 1;
}
}
// p 为线索二叉树的根结点
ThreadNode *FirstNode(ThreadNode *p)
{
while (p->ltag == 0)
{
p = p->lchild;
}
return p;
}
// p 为结点
ThreadNode *NextNode(ThreadNode *p)
{
if (p->rtag == 0)
{
return FirstNode(p.rchild); // 如果有孩子结点,则后继结点就是右子树最左侧的结点
}
else
{
return p.rchild;
}
}
// 遍历
void InOrder(ThreadNode *T)
{
for (ThreadNode *p = FirstNode(T); p != NULL; p = NextNode(p))
{
visit(p);
}
}
标签:pre,结点,NULL,ThreadNode,二叉树,数据结构,线索,考研
From: https://www.cnblogs.com/bi-hu/p/16720896.html