二叉树的三种遍历的非递归实现

来源:互联网 发布:win10更新windows.old 编辑:程序博客网 时间:2024/05/10 00:56

三种遍历的非递归实现:

//coder:LEE

//20120309
#include<iostream>
#include<cassert>
#include<stack>
using namespace std;
struct BiTreeNode
{
int value;
BiTreeNode *pLeft;
BiTreeNode *pRight;
};
void AddNode(BiTreeNode *&root,int data)
{
if(root==NULL)
{
root=new BiTreeNode();
root->pLeft=NULL;
root->pRight=NULL;
root->value=data;
}
else if(data<root->value)
AddNode(root->pLeft,data);
else
AddNode(root->pRight,data);

}

/*

后序遍历(非递归)
思想是: 
先找到最左边的叶子并把路上遇到的节点依次压栈,然后弹出栈顶的元素(该元素为最左边的叶子),并判
断(1)它有没有右节点;(2)右节点是否被访问过。如果没有右节点或者右节点已被访问过,则出栈,访
问该节点,并设置have_visited为该节点。否则转到右子树,为下次循环,压栈做准备。
*/
void PostOrderNoRec(BiTreeNode *root)
{
stack<BiTreeNode *> s;
BiTreeNode *have_visited=NULL;
BiTreeNode *p=root;
while (p!=NULL||!s.empty())
{
while(p!=NULL)
{
s.push(p);
p=p->pLeft;
}
p=s.top();
if (p->pRight==NULL||have_visited==p->pRight)
{
cout<<p->value<<" ";
s.pop();
have_visited=p;
p=NULL;
}
else
p=p->pRight;
}
}
void InOrderNoRec(BiTreeNode *root)//中序遍历(非递归)
{
stack<BiTreeNode *> s;
BiTreeNode *have_visited=NULL;
BiTreeNode *p=root;
while (p!=NULL||!s.empty())
{
while(p!=NULL)
{
s.push(p);
p=p->pLeft;
}
p=s.top();
cout<<p->value<<" ";
s.pop();
if (p->pRight!=NULL)
p=p->pRight;
else
p=NULL;
}
}
void PreOrderNoRec(BiTreeNode *root)//先序遍历(非递归)
{
stack<BiTreeNode *> s;
BiTreeNode *have_visited=NULL;
BiTreeNode *p=root;
while (p!=NULL||!s.empty())
{
if(p!=NULL)
{
cout<<p->value<<" ";
s.push(p);
p=p->pLeft;
}
else
{
p=s.top();
s.pop();
p=p->pRight;
}
}
}
int main()
{
BiTreeNode * root=NULL;
AddNode(root,11);
AddNode(root,8);
AddNode(root,9);
AddNode(root,10);
AddNode(root,5);
AddNode(root,2);
AddNode(root,1);
AddNode(root,6);
AddNode(root,7);
PreOrderNoRec(root);
return 0;
}
原创粉丝点击