在一颗二叉树中,要将它按对称序线索化,其做法是按对称序周游此二叉树,在周游的过程中用线索代替空指针。
周游采用非递归的方法对二叉树按顺序周游,所以设置一个栈结构,保存周游过程中需要回溯的指针。
算法中的指针,p指向正在访问的结点,pr是指向它的对称序的前驱,即上一次刚访问过的结点。
//按对称序线索化二叉树
void thread(ThrTree t) {
PSeqStack st = createEmptyStack_seq(10);
ThrTree p, pr;
p = t;
pr = NULL;
do
{
while (p!=NULL)
{
push(st, p);
p = p->llink; //遇到结点推入栈中,然后进入其左子树
}
p = top(st);
pop(st);
if (pr != NULL) {
if (pr->rlink == NULL) {
pr->rlink = p;
pr->rtag = 1;
}
//修改前驱结点的右指针
if (p->llink == NULL) {
p->llink = pr;
p->ltag = 1;
}
//修改该结点的左指针
}
pr = p;
p = p->rlink;
} while (!isStackEmpty(st)||p!=NULL);
}
要周游对称序二叉树,首先找到对称序列中的第一个结点,然后依次找到结点的后继结点,直到其后继结点为空即可。
要找第一个结点,只要从根节点出发