非递归反向遍历算法
利用中序线索二叉树的特点。因为线索二叉树中的结点的左指针要么指向左孩子要么指向前驱结点,右指针要么指向右孩子要么指向后继结点,利用这种特性就可以实现非递归不设栈结构遍历一棵树。下面是主要的代码实现,线索二叉树类的构建这里不再赘述:
注意:这里的中序线索二叉树类带头结点,也就是中序序列的第一个结点的左指针并不指向NULL,而是指向头结点。
同样,中序序列的最后一个结点的右指针也不是指向NULL,也是指向头结点。
头结点的左指针指向这棵树的根节点,右指针指向中序序列的最后一个结点。
TBTNode *last(TBTNode *root) //返回root为根的中序线索树中的最后结点
{
TBTNode *p = root->rChild; //头结点的右指针直接指向了中序序列的最后一个结点
return root;
}
TBTNode *prior(TBTNode *root,TBTNode *q) //返回q的前驱结点
{
TBTNode *p = q->lChild, *r; //p成为q的左孩子/左线索
if(q->ltag==0) //如果q有左孩子
while(p->rtag==0) //取左子树的最后一个结点
p = p->rChild;
r = p;
if(r==root) return NULL; //若结点没有前驱就会指向root
else return r;
}
void back(TBTNode *root) //中序反向遍历二叉树
{
TBTNode *p;
for(p=last(root); p!=NULL; p = prior(root,p)) //循坏遍历
cout<<p->data; //输出结果
cout<<endl;
}
同样的思想自然可以实现中序非递归正向遍历算法,代码步骤大同小异,可以类推。