二叉树的三种遍历的非递归实现
来源:互联网 发布: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;
}
- 二叉树的三种遍历的非递归实现
- 二叉树的三种遍历的非递归实现
- 三种二叉树遍历的非递归实现
- 二叉树的三种遍历非递归实现
- 二叉树的三种递归遍历与非递归遍历-C++实现
- 二叉树的三种遍历(递归+非递归)
- 二叉树的三种遍历方式的递归实现和非递归实现
- 二叉树的三种遍历方式(递归和非递归的实现方法)
- 二叉树的三种遍历方式的递归与非递归实现
- 43 递归和非递归俩种方法实现二叉树的三种遍历
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- 二叉树的三种遍历方式(递归与非递归详细实现)
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- 二叉树的非递归的三种遍历
- 非递归实现二叉树的遍历
- 非递归实现二叉树的遍历
- 二叉树遍历的非递归实现
- 二叉树遍历的非递归实现
- 在frame之间互相调用javascript函数
- 导致java.lang.NullPointerException异常的一种情况
- 计算机专业技能
- 输出两个数的最小
- java JTable 中设置没列的宽度
- 二叉树的三种遍历的非递归实现
- 开始自己的opencv之旅
- 输入三个数的和及平均值
- Gentoo Linux下查看工作组网络时提示:Nautilus cannot handle "smb" locations.
- C#贪吃蛇
- 计算圆柱体的体积
- STL vector用法介绍
- 在5*5数组中输出最小值
- 单文档程序中动态切换多个窗体