二叉树后序遍历非递归详解
1. 首先给出一颗二叉树,如下图所示:
图1 一颗简单的二叉树
根据二叉树的后序遍历的特性,该二叉树后序遍历顺序为:
D G E B H I F C A
2. 一般遍历一颗二叉树,先序中序或者后序,大家最喜欢也最熟悉的方法是采用递归的形式来描述,但是在面试或者笔试的过程中,面试官一般都会要求采用非递归形式的二叉树遍历过程。我们先给出二叉树的递归形式(以后序遍历为例子),然后给出二叉树的非递归形式。
Void postOrder(BiTree root){
If(root!=NULL){
postOrder(root->left);
postOrder(root->right);
cout<<root->data<<”\t”;
}
}
3. 二叉树后序非递归写法如下,先给出代码,后面会具体给出代码分析:
voidpostOrderRecursive(PTreeT root)
{
if (!root) return;
stack<PTreeT> s1,s2;//建立两个工作栈;
PTreeT p=NULL;//工作指针
s1.push(root);//将根节点压入栈s1中;
while (!s1.empty())
{
p=s1.top(); //将p指向s1中的栈顶元素;
s1.pop(); //将保存在栈s1中的根节点出栈;
s2.push(p); //将s1中的栈顶元素压入栈s2中;
if (p->left) //判断当前节点p的左子树是否为空,不为空则压入栈s1;
{
s1.push(p->left);
}
if (p->right)//判断当前节点p的右子树是否为空,不为空则压入栈s1;
{
s1.push(p->right);
}
}
while (!s2.empty())//所有的节点在上面的循环完成之后都已经压入栈s2中,现在只需要输出栈s2中的元素,就是后序遍历;
{
cout<<s2.top()->data<<"\t";
s2.pop();
}
cout<<endl;
}