二叉树遍历方法小结
来源:互联网 发布:javascript 数组初始化 编辑:程序博客网 时间:2024/06/15 02:26
二叉树深度优先遍历
一、前序遍历
过程:若二叉树非空,按下面的步骤
(1)访问根结点;
(2)按前序遍历次序遍历根结点的左子树;
(3)按前序遍历次序遍历根结点的右子树;
将上述递归算法转化为非递归算法:
(1)将二叉树的根结点作为当前结点;
(2)若当前结点非空,则先访问该结点,并将该结点进栈,再将其左孩子结点作为当前结点,重复步骤(2),直到当前结点为空为止;
(3)若栈非空,则栈顶结点出栈,并将当前结点的右孩子结点作为当前结点;
(4)重复步骤(2)、(3),直到栈为空且当前结点为空为止。
二、中序遍历
过程:若二叉树非空,按下面的步骤:
(1)按中序遍历根结点的左子树;
(2)访问根结点;
(3)按中序遍历次序遍历根结点的右子树;
将上述递归算法转化为非递归算法:
(1)将二叉树的根结点作为当前结点;
(2)若当前结点非空,则该结点进栈并将其左孩子结点作为当前结点,重复步骤(2),直到当前结点为空为止。
(3)若栈非空,则将栈顶结点出栈并作为当前结点,接着访问当前结点,再将当前结点的右孩子结点作为当前结点;
(4)重复步骤(2)、(3),直到栈为空且当前为空为止。
三、后序遍历
过程:若二叉树非空,则做如下的操作:
(1)按后序遍历次序遍历结点的左子树;
(2)按后序遍历次序遍历结点的右子树;
(3)访问根结点;
将上述递归算法转化为非递归算法:
(1)将二叉树的根结点作为当前结点;
(2)若当前结点非空,则该结点进栈并将其左孩子结点作为当前结点,重复步骤(2),直到当前结点为空为止。
(3)若栈非空,栈顶结点出栈作为当前结点,若是其标志为第一次进栈(flag==0),则以当前结点的标志更改(flag==1),并再次入栈,把当前结点的右孩子作为当前结点。
(4)重复步骤(2)、(3),直到栈为空且当前为空为止。
特点总结:
(1)每个结点要进栈、出栈各再次;因为左子树访问后要找栈顶元素的右子树,访问完右子树才能访问栈顶元素(相当于某子树根结点);
(2)访问完栈顶元素后,当前结点设为空,表示某子树已访问完,重新找根结点,访问其右子树。
(3)为区别同一个结点的再次进栈,需要设置一个标志(flag)。
Flag=0,第一次进栈,表示该结点出栈之后不能访问。
Flag=1,第二次进栈,表示该结点出栈之后可以访问。
二叉树广度优先遍历
(1)遍历前先将二叉树的根结点存入队列中;
(2)然后依次从队列中取出队头结点,每取出一个结点,都先访问该结点;
(3)接着分别检查该结点是否存在左、右孩子,若存在则先后入列;
(4)重复步骤(2)、(3),直到队列为空为止。
- 二叉树遍历方法小结
- 遍历二叉树小结
- 二叉树遍历小结
- 二叉树遍历方法
- 二叉树遍历方法
- 非递归遍历二叉树小结
- 二叉树的遍历方法
- 二叉树的遍历方法
- 二叉树遍历方法总结
- Morris方法遍历二叉树
- Robson方法遍历二叉树
- Morris方法遍历二叉树
- 二叉树的遍历方法
- 二叉树的遍历方法
- 二叉树的遍历方法
- 一种二叉树遍历方法
- 数据结构--二叉树遍历方法
- 树的小结和二叉树的递归遍历
- 什么是NP问题,什么是NP hard问题,什么是NP完全问题。
- 安装 SSH Tunneling
- 如何发送和接收应用层数据包?
- 关于NP-hard NP-complete问题定义典故与解释证明
- QUEUE——队列(procedure)
- 二叉树遍历方法小结
- Ubuntu中Git服务器搭建
- 大话设计模式_程杰(奋斗的小鸟)_PDF 电子书
- 一个从NDK中提取独立工具链的脚本
- 轻松使用线程: 不共享有时是最好的——利用 ThreadLocal 提高可伸缩性
- 从1-n这n个数里面,随机选出若干个数,使之和为sum
- 负载类型为 MPEG-4 Elementary Stream 的 RTP 包的封包讲解
- HDOJ 4386 —— 简单几何
- 自我介绍,我是小小的菜鸟程序员