您的位置:首页 > 其它

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

2012-03-09 20:27 405 查看
三种遍历的非递归实现:

//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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: