//二叉树遍历的非递归算法
#include<iostream>
#include<stack>
using namespace std;
typedef struct BiTreeNode
{
int data;
BiTreeNode* lchild;
BiTreeNode* rchild;
BiTreeNode(int x) : data(x), lchild(NULL), rchild(NULL) {}
};
//先序遍历
void PreOrder(BiTreeNode* T)
{
stack<BiTreeNode*> s;
BiTreeNode *p = T;
while(p || !s.empty())
{
if(p)
{
cout<<p->data;
s.push(p);
p = p->lchild;
}
else
{
p = s.top();//取栈顶结点
s.pop();//弹出栈
p = p->rchild;//向右
}
}//While
}
//中序遍历
void InOrder(BiTreeNode* T)
{
stack<BiTreeNode*> s;
BiTreeNode* p = T;
while(p || !s.empty())
{
if(p)
{
s.push(p);
p = p->lchild;
}
else
{
p = s.top();//取栈顶结点
s.pop();//弹出栈
cout<<p->data;//输出结点值
p = p->rchild;
}//else
}//while
}
//后序遍历
void PostOrder(BiTreeNode* T)
{
stack<BiTreeNode*> s;
BiTreeNode* p = T,*r = NULL;//r为标志指针,可以利用它判断此结点是否访问过
while(p || !s.empty())
{
if(p)//走到最左边
{
s.push(p);
p = p->lchild;
}
else//向右
{
p = s.top();//取栈顶结点
if(p->rchild && p->rchild != r)//如果右子树存在,判断是否访问过
{
p = p->rchild;//转向右
s.push(p);//压入栈
p = p->lchild;//再走到最左
}
else
{
p = s.top();//取栈顶结点
s.pop();//弹出栈
cout<<p->data;//输出结点值
r = p;//记录最近访问过的结点
p = NULL;//结点完,重置p指针
}
}//else
}//While
}
//***********测试代码************
// 1
// / \
// 2 3
// /\
// 4 5
void main()
{
BiTreeNode* Node1 = new BiTreeNode(1);//生成节点
BiTreeNode* Node2 = new BiTreeNode(2);
BiTreeNode* Node3 = new BiTreeNode(3);
BiTreeNode* Node4 = new BiTreeNode(4);
BiTreeNode* Node5 = new BiTreeNode(5);
BiTreeNode* Node6 = new BiTreeNode(6);
BiTreeNode* Node7 = new BiTreeNode(7);
Node1->lchild=Node2;//连接节点
Node1->rchild=Node3;
Node2->lchild=Node4;
Node2->rchild=Node5;
cout<<"先序遍历"<<endl;
PreOrder(Node1);
cout<<endl;
cout<<"中序遍历"<<endl;
InOrder(Node1);
cout<<endl;
cout<<"后序遍历"<<endl;
PostOrder(Node1);
cout<<endl;
}
二叉树遍历的非递归算法
最新推荐文章于 2020-08-31 22:08:13 发布