这三也是经典的二叉树的三种方法

二叉树的前序遍历

递归实现

public class Main4 {static ArrayList<TreeNode> list = new ArrayList<TreeNode>();int QianXu(TreeNode t) {//根,判定第一个节点(根)是否存在if(t==null) {return 0;}  list.add(t);//左if(t.left!=null) {          HouXu(t.left);  }   //右if(t.right!=null) {     HouXu(t.right);}return 0;}public static void main(String[] args) {TreeNode tn1= new TreeNode(1);TreeNode tn2= new TreeNode(2);TreeNode tn3= new TreeNode(3);TreeNode tn4= new TreeNode(4);TreeNode tn5= new TreeNode(5);TreeNode tn6= new TreeNode(6);TreeNode tn7= new TreeNode(7);tn1.left=tn2;tn1.right=tn3;tn2.left=tn4;tn2.right=tn5;tn3.left=tn6;tn3.right=tn7;new Main4().QianXu(tn1);for(int i =0;i<list.size();i++) {System.out.print(list.get(i).val);}}
}

这个没什么难理解的,顺序就是根,左,右节点,如果有左右节点就遍历,没有就不往左节点或右节点遍历了

非递归实现

前序遍历的非递归实现就不写了,很简单,和深度优先一样,我不知道别人有用什么奇怪方法的,但是我用栈来实现深度优先,可以参考二叉树广度优先搜索和深度优先搜索

二叉树的中序遍历

1、使用递归的方式实现

class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }}
public class Main3 {static ArrayList<TreeNode> list = new ArrayList<TreeNode>();int ZhongXuBianLi(TreeNode tn) {if(t==null) {  //判定第一个节点(根)是否存在return 0;}    //左if(tn.left!=null) {ZhongXuBianLi(tn.left);} //根list.add(tn);//右if(tn.right!=null) {ZhongXuBianLi(tn.right);        }   return 0;}  public static void main(String[] args) {TreeNode tn1= new TreeNode(1);TreeNode tn2= new TreeNode(2);TreeNode tn3= new TreeNode(3);TreeNode tn4= new TreeNode(4);TreeNode tn5= new TreeNode(5);TreeNode tn6= new TreeNode(6);TreeNode tn7= new TreeNode(7);tn1.left=tn2;tn1.right=tn3;tn2.left=tn4;tn2.right=tn5;tn3.left=tn6;tn3.right=tn7;new Main3().ZhongXuBianLi(tn1);for(int i =0;i<list.size();i++) {System.out.print(list.get(i).val);}}
}

结果:

使用的例子示例图

分析这个可能有点眼花缭乱,那就先看小的部分

这个怎么能成中序遍历呢?
肯定是213吧,那是不是先把2节点放进去,再把1节点放进去,再把三节点放进去呢!肯定的
那给的节点肯定是1节点了,那访问的顺序肯定就是先从1到2,再经过1到3。
而这个顺序正好有一个中序遍历的顺序,那就是213,所以就从2节点开始放,那怎么知道到2了呢?
那就找左子树是null的节点就行,添加完2肯定就是返回,返回到根节点添加1,再通过右子树为null找到3,添加进去,就完成了。
再经过递归就可以成大的了、

2、使用非递归的方式实现(使用栈)

TreeNode是二叉树的节点,上个程序有,这就不添加上了

 //非递归int ZhongXuBianLi1(TreeNode tn) {//根不存在if(tn==null) {return 0;}  Stack<TreeNode> stack = new Stack<TreeNode>(); stack.add(tn);//isEmpty只有当size==0时才返回truewhile(stack.isEmpty()==false) {         //第一步if(tn!=null) {                       //第二步stack.add(tn);tn = tn.left;           }else {                                 //第三步tn = stack.pop();list.add(tn);            if(stack.isEmpty()==false) {          //第四步tn = stack.pop();list.add(tn);                }tn = tn.right;            }           }       return 0;}  public static void main(String[] args) {TreeNode tn1= new TreeNode(1);TreeNode tn2= new TreeNode(2);TreeNode tn3= new TreeNode(3);TreeNode tn4= new TreeNode(4);TreeNode tn5= new TreeNode(5);TreeNode tn6= new TreeNode(6);TreeNode tn7= new TreeNode(7);tn1.left=tn2;tn1.right=tn3;tn2.left=tn4;tn2.right=tn5;tn3.left=tn6;tn3.right=tn7;new Main3().ZhongXuBianLi1(tn1);for(int i =0;i<list.size();i++) {System.out.print(list.get(i).val);}}

这个的例子也是用的

因为不是用递归实现,所以就需要用while或者for来代替递归了,说实话递归的确好理解

一步一步的来分析分析怎么用栈来解决的,用栈怎么实现的。
首先看一张图

不知道你能不能看懂,一开始我也看不懂,经过自己写这个过程就会了,
这些不同颜色的实线箭头 就是进栈的顺序(这些箭头是不可以打断的,比如1,2,4必须进栈是1、2、4,不能在4之前插入一个)
当然出栈的没写,根据入栈的顺序,和中序遍历的顺序结合,其实就能写出 出栈的顺序。

按这个思路,首先你需要while循环一下把1、2、4都添加进去吧,之后出4,2,再把5进栈
之后5,1出栈,3、6进栈,再3、6出栈,7入栈,再7出栈,就构成了中序遍历

上面的思路好理解,但是实现有点困难,看程序,
1、首先解决的是while的判定条件,因为这个过程中栈空代表着么有没有节点了,所以结束了,
2、之后是怎么一口气把像1、2、4这样的节点入栈
3、什么情况下开始出栈,出栈几个(要考虑到有可能连着的父节点,祖父节点等没有右节点),
4、考虑到出栈到根节点的情况
上面的4个正好对应程序中关键的四步

二叉树的后序遍历

递归实现

class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }}
public class Main4 {static ArrayList<TreeNode> list = new ArrayList<TreeNode>();int HouXu(TreeNode t) {if(t==null) {  //判定第一个节点(根)是否存在return 0;} //左if(t.left!=null) {          HouXu(t.left);  }       //右if(t.right!=null) {     HouXu(t.right);}list.add(t);    return 0;}public static void main(String[] args) {TreeNode tn1= new TreeNode(1);TreeNode tn2= new TreeNode(2);TreeNode tn3= new TreeNode(3);TreeNode tn4= new TreeNode(4);TreeNode tn5= new TreeNode(5);TreeNode tn6= new TreeNode(6);TreeNode tn7= new TreeNode(7);tn1.left=tn2;tn1.right=tn3;tn2.left=tn4;tn2.right=tn5;tn3.left=tn6;tn3.right=tn7;new Main4().HouXu(tn1);for(int i =0;i<list.size();i++) {System.out.print(list.get(i).val);}}
}

非递归实现

用两个栈来实现,当压入第一个栈是1,取出来把它左右都压进栈,再把1压入另一个栈,这样循环下去,第二个栈的出栈顺序就是后续遍历

int HouXu1(TreeNode t) {if(t==null) {return 0;}Stack<TreeNode> stack1=new Stack<TreeNode>();Stack<TreeNode> stack2=new Stack<TreeNode>();stack1.add(t);while(!stack1.isEmpty()) {t =stack1.pop();if(t.left!=null) {stack1.add(t.left);}if(t.right!=null) {stack1.add(t.right);}stack2.add(t);}while(!stack2.isEmpty()) {list.add(stack2.pop());}return 0;}public static void main(String[] args) {TreeNode tn1= new TreeNode(1);TreeNode tn2= new TreeNode(2);TreeNode tn3= new TreeNode(3);TreeNode tn4= new TreeNode(4);TreeNode tn5= new TreeNode(5);TreeNode tn6= new TreeNode(6);TreeNode tn7= new TreeNode(7);tn1.left=tn2;tn1.right=tn3;tn2.left=tn4;tn2.right=tn5;tn3.left=tn6;tn3.right=tn7;new Main4().HouXu1(tn1);for(int i =0;i<list.size();i++) {System.out.print(list.get(i).val);}}

分析分析这三种遍历中递归的区别(非递归联系不是很大)

自己整理完这三种遍历的算法,感觉也就那样,尤其是递归的,更没什么

     if(t==null) {     //这个必须排第一个return 0;}                                list.add(t);        //第一部分//左if(t.left!=null) {            //第二部分HouXu(t.left);    }   //右if(t.right!=null) {      //第三部分HouXu(t.right);}return 0;

前序遍历、中序遍历、后序遍历也就是上面三部分根据前面序列的规则排序而已。
举个例子:
前序要求根节点,左节点,右节点。那上面排序的规则就是第一部分(根)、第二部分(左)、第三部分(右)

很简单。看别人千万遍不如自己写一遍,总结一遍啊。

二叉树的前序遍历,中序遍历,后序遍历相关推荐

  1. 二叉树深度优先 java_二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历) java实现...

    二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的.对于二叉树,有深度遍历和广度遍历,深度遍历有前序.中序以及后序三种遍历方法,广度遍历即我们寻常所说的层次遍历.由于树的 ...

  2. 二十五、二叉树的前序、中序、后序遍历

    一.为何使用树这种数据结构 数组存储方式的分析 优点:通过下标方式访问元素,速度快.对于有序数组,还可使用二分查找提高检索速度. 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较 ...

  3. 手动创建一棵二叉树,然后利用前序、中序、后序、层序进行遍历(从创建二叉树到各种方式遍历)(含运行结果)

    手动创建一棵二叉树,然后利用前序.中序.后序.层序进行遍历 import java.util.LinkedList; import java.util.List; import java.util.Q ...

  4. 【LeetCode系列】从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树 ...

  5. 105从前序与中序遍历序列构造二叉树 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)

    引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程: 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导 ...

  6. 二叉树的前序、中序和后序遍历介绍及案例

    文章目录 一.介绍 二.建立二叉树 1.节点类 2.二叉树 三.前序遍历 四.中序遍历 五.后序遍历 六.完整代码 一.介绍 前序遍历.中序遍历和后序遍历是二叉树的三种遍历方式,三者很像,具体的遍历步 ...

  7. 二叉树前序、中序、后序遍历求法

    二叉树前序.中序.后序遍历相互求法 二叉树的三种遍历方法: 前序遍历: 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历: 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序 ...

  8. PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次) 转载陈小龙哈2017...

    http://blog.csdn.net/baidu_30000217/article/details/52953127 前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点 ...

  9. 二叉树前序、中序和后序遍历的非递归实现

    1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...

  10. 二叉树的前序、中序、后序遍历与创建

    #include <iostream> #include <string> #include <stack> using namespace std; struct ...

最新文章

  1. Android小知识-Fragment
  2. SpringMVC-设置编码过滤器
  3. oracle 中序号的一种生成方式
  4. HTML5数据库建模,HTML5的五种客户端离线存储方案
  5. 团队项目开发编码规范之一:概述
  6. 2019计算机考研在职研究生,2019双证在职研究生报名条件
  7. 微信小程序识别图片并提取文字_图片转文字识别功能的小程序,超精准识别——闪电识字...
  8. linux系统做的小游戏,2007最新 100个Linux系统上的小游戏汇集
  9. 概率论和数理统计 - 01
  10. python采用函数式编程模式-浅谈Python 函数式编程
  11. Smoke Test Ad hoc Test
  12. ABAP术语-Business Components
  13. 520 miix 小兵 黑苹果,Hackintosh黑苹果长期维护机型整理清单
  14. DM 关键字、屏蔽关键字
  15. o.redisson.client.handler.CommandsQueue : Exception occured.
  16. 超市商品管理系统java
  17. Windows 11 已修复 AMD CPU 性能问题
  18. Netbeans安装教程
  19. 用户注册后是如何进行激活的,为什么需要激活
  20. wap商城源码php,ecshop商城源码html5手机wap响应式自适应php网站模板带后端dossy

热门文章

  1. 程序员数学(9)--不等式与不等式组
  2. 【STL详解】stack
  3. 戴尔服务器720dx格式化硬盘,《图解戴尔iDRAC服务器远程控制设置》.docx
  4. m-序列简述及其相关性质
  5. MDK的HardFault硬件异常和NMI异常原因总结
  6. EOS 命令行创建账号及发币
  7. 提升新网站优化排名,学会这三个方法就够了
  8. Java精品项目源码第109期精美风在线音乐网站
  9. 袁萌浅谈C919大飞机(三)
  10. 【嵌入式】网络编程_pthread_fork