二叉树遍历
来源:互联网 发布:淘宝算命害了多少人 编辑:程序博客网 时间:2024/06/04 00:47
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后续遍历实现起来相对来说要难一点。
一.前序遍历
1.递归实现
void preOrder1(BinTree *root)
{
if(root!=NULL)
{
cout<<root->data<<" ";
preOrder1(root->lchild);
preOrder2(root->rchild);
}
}
2.非递归实现
思路:
1)访问节点平,并将节点p入栈;
2)判断p的左孩子是否为空,若为空,则取栈顶节点并进行出栈,并将栈顶节点的右孩子设为当前节点p,循环1),再将p的左孩子作为当前节点p;
3)直到p为空且栈为空,遍历结束;
void preOrder2(BinTree *root)
{
stack<BinTree *> s;
BinTree *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
cout<<p->data<<" ";
s.push(p);
p=p->lchild;
}
while(!s.empty())
{
p=s.top();
s.pop();
p=p->rchild;
}
}
二.中序遍历
1.递归遍历
void Inorder1(BinTree* root)
{
while(root!=NULL)
{
Inorder1(root->lchild);
cout<<root->data<<" ";
Inorder2(root->rchild);
}
}
2.非递归实现
void Inorder2(BinTree* root)
{
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
s.push(p);
p=p->lchild;
}
while(!s.empty())
{
p=s.top();
cout<<p->data<< " ";
s.pop();
p=p->rchild;
}
}
三 后序遍历
1.递归遍历
void postOrder1(BinTree *root) //递归后序遍历
{
if(root!=NULL)
{
postOrder1(root->lchild);
postOrder1(root->rchild);
cout<<root->data<<" ";
}
}
- 二叉树遍历、分层遍历
- 遍历二叉树--二叉树
- 【树】遍历二叉树
- 二叉树遍历
- 二叉树遍历
- 二叉树的遍历
- (原创)遍历二叉树
- 二叉树遍历-php
- 查找--遍历二叉树
- 遍历二叉树
- 二叉树遍历规则
- 二叉树的遍历
- 二叉树遍历
- 遍历二叉树
- 二叉树遍历问题
- 二叉树遍历
- 二叉树遍历(zz)
- 二叉树的遍历
- mysql5.6配置同步复制的新方法以及常见问题的解决方法
- xenbus and xenstore
- gvim关闭菜单栏和工具栏
- eclipse报错:org.eclipse.swt.custom.StyledText.getScrollbarsMode()I
- Project Euler problem 479
- 二叉树遍历
- [MOOC笔记]第一章 绪论(数据结构)
- attempt to create delete event with null entity解决办法
- SQL中on条件与where条件的区别[转]
- ZOJ 3805 Machine
- hdu 1864 最大报销额 01背包
- 水仙花数
- eclipse报错:org.eclipse.swt.custom.StyledText.getScrollbarsMode()I
- 内核学习