在上一篇中我们已经将二叉树线索化,一个线索化了的二叉树,可以按照线索顺序采用非递归的方法将二叉树遍历。
具体思路如下:
按线索顺序遍历的关键在于怎么找到下一个结点顺利进入,要找下一个结点就要根据当前结点屁股上的线索来找。
观察可知rchild有两种指向:一种是指向后继的,rtag=1;
一种是指向右孩子(该右孩子是右子树的根结点),rtag=0;
设p是当前结点,rchild指向后继的,p->rchild即下一号结点,直接找到;
rchild指向右孩子的,则当作新开了一棵树,p->rchild是右孩子(也是新树的根结点)此时必须找到新树的最左结点才是下一号结点,因此必须有一个找一棵树第一号结点(即最左结点)的功能来应对所有rchild指向右孩子的结点。
设计两个功能函数:
1.返回当前结点的下一号结点保证按顺序遍历
ThreadNode *NextNode(ThreadNode *p){
if(rtag==0)
return FirstNode(p->rchild);
else
return p->rchild;
}
C++复习:ThreadNode *NextNode()表示这个函数返回ThreadNode型指针
2.现有以当前结点为根的新树,返回该树的一号结点
ThreadNode *FirstNode(ThreadNode *p){
while(p->ltag==0)
P=P->lchild;
return p;
}
主函数为:
void Inorder(ThreadNode *T){
for(ThreadNode *p=FirstNode(T);p!=NULL;p=NextNode(p))
visit(p);
}