二叉树的三种遍历的非递归实现
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;
}
//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;
}
相关文章推荐
- 非递归实现二叉树三种遍历
- 二叉树的三种遍历方式的递归与非递归实现
- 递归实现二叉树的三种遍历
- 详细讲解二叉树三种遍历方式的递归与非递归实现
- 数据结构学习之-二叉树的三种递归遍历C++实现及相关应用
- 二叉树三种遍历方式非递归实现
- 二叉树的三种递归遍历实现
- 二叉树三种非递归遍历实现
- 二叉树的构建和三种遍历算法 (递归实现)
- 二叉树三种遍历方式的递归与非递归实现
- 详细讲解二叉树三种遍历方式的递归与非递归实现
- 二叉树的建立以及三种遍历方式的递归、非递归的实现
- 二叉树三种遍历的非递归实现
- 从递归的异同分析二叉树先序、中序、后序遍历共同流程并实现非递归方式的三种遍历。
- Java三种遍历方式打印二叉树(递归实现)
- 二叉树的三种遍历方式的递归实现和迭代实现
- 二叉树三种遍历方式 递归与非递归实现
- 43 递归和非递归俩种方法实现二叉树的三种遍历
- 二叉树的三种遍历方式(递归与非递归详细实现)
- 二叉树的三种遍历方式(递归和非递归的实现方法)