遍历代码

递归法

public class BinaryTreeTest {public static void main(String[] args) {System.out.println("开始先序遍历");preOrderTraversal(getRootOfBinaryTree());System.out.println();System.out.println("开始中序遍历");middleOrderTraversal(getRootOfBinaryTree());System.out.println();System.out.println("开始后序遍历");postOrderTraversal(getRootOfBinaryTree());}/*** 先序遍历 从上至下,先遍历左子树 到叶子节点 再从往上把所有的右节点遍历完* @param node*/public static void preOrderTraversal(IntNode node){if(Objects.isNull(node)){return;}System.out.print(node.self + " ");preOrderTraversal(node.left);preOrderTraversal(node.right);}/*** 中序遍历 遍历完左子树 再访问跟 再访问右子树* @param node*/public static void middleOrderTraversal(IntNode node){if(Objects.isNull(node)){return;}middleOrderTraversal(node.left);System.out.print(node.self + " ");middleOrderTraversal(node.right);}/*** 后序遍历 左-中-右* @param node*/public static void postOrderTraversal(IntNode node){if(Objects.isNull(node)){return;}postOrderTraversal(node.left);postOrderTraversal(node.right);System.out.print(node.self + " ");}public static IntNode getRootOfBinaryTree(){IntNode root = new IntNode(1);IntNode node2 = new IntNode(2);IntNode node3 = new IntNode(3);IntNode node4 = new IntNode(4);IntNode node5 = new IntNode(5);IntNode node6 = new IntNode(6);IntNode node7 = new IntNode(7);IntNode node8 = new IntNode(8);IntNode node9 = new IntNode(9);IntNode node10 = new IntNode(10);IntNode node11 = new IntNode(11);IntNode node12 = new IntNode(12);IntNode node13 = new IntNode(13);root.left = node2;root.right = node3;node2.left = node4;node2.right = node5;node4.left = node8;node3.left = node6;node3.right = node7;node6.left = node9;node6.right = node10;node9.left = node11;node7.right = node12;node12.left = node13;return root;}}

先序非递归

    public static void preOrderTraversalNotRecursion(IntNode node){if(Objects.isNull(node)){return;}Stack<IntNode> stack = new Stack();//从头部开始压栈 弹出 压右节点 压做节点 弹出 重复上述动作stack.push(node);while(!stack.isEmpty()){IntNode currentNode = stack.pop();System.out.print(currentNode.self + " ");//栈是先进后出 先序是中 左 右,要反着来 先压右if(currentNode.right!=null){stack.push(currentNode.right);}if(currentNode.left!=null){stack.push(currentNode.left);}}}

中序非递归

    /*** 中序遍历 非递归* @param node*/public static void middleOrderTraversalNotRecursion(IntNode node){if(Objects.isNull(node)){return;}Stack<IntNode> stack = new Stack();stack.push(node);//从头部开始压栈 弹出 压右节点 压做节点 弹出 重复上述动作IntNode leftNode = node;while((leftNode = leftNode.left)!=null){stack.push(leftNode);}while(!stack.isEmpty()){IntNode currentNode = stack.pop();System.out.print(currentNode.self + " ");//栈是先进后出 先序是中 左 右,要反着来 先压右if(currentNode.right!=null){middleOrderTraversalNotRecursion(currentNode.right);}}}

后续非递归

    public static void postOrderTraversalNotRecursion(IntNode node){if(Objects.isNull(node)){return;}Stack<IntNode> stack = new Stack();Stack<IntNode> targetStack = new Stack();//从头部开始压栈 弹出 压右节点 压做节点 弹出 重复上述动作stack.push(node);while(!stack.isEmpty()){IntNode currentNode = stack.pop();targetStack.push(currentNode);//先压左 再压右if(currentNode.left!=null){stack.push(currentNode.left);}if(currentNode.right!=null){stack.push(currentNode.right);}}while(!targetStack.isEmpty()){System.out.print(targetStack.pop().self + " ");}}

二叉树DEMO 

遍历结果

开始先序遍历
1 2 4 8 5 3 6 9 11 10 7 12 13 
开始中序遍历
8 4 2 5 1 11 9 6 10 3 7 13 12 
开始后序遍历
8 4 5 2 11 9 10 6 13 12 7 3 1

遍历思路

所谓的先 中 后都是基于中间的节点而言的

先序遍历【中 左 右】

从上至下遍历一遍最左侧的节点,到了叶子结点,往上返回遍历有右子节点的节点(这个时候是从下往上遍历),

左子树遍历完,开始遍历右子树过程一样(重复上面过程)

中序遍历【左 中 右】

从下至上,从最左侧的叶子结点往上走,有右侧节点遍历右侧节点,无右侧节点继续往上走

上侧无节点 遍历右子树,和上述步骤一样

后续遍历【左 右 中】

从下往上,从最左侧的节点开始,找他的右侧兄弟节点,若右侧兄弟节点不存在,往上遍历

若该侧的树都遍历完了,跳过跟节点,遍历右侧的子树,遍历步骤和上述步骤一样

小测试-看这个的三种遍历顺序如何

二叉树遍历【递归非递归】相关推荐

  1. 漫谈二叉树遍历(非递归)

    ------这篇文章旨在提出一种简单方便,易于理解时空复杂度低且风格统一的二叉树非递归遍历方法. 从二叉树先序遍历开始 二叉树的先序遍历(非递归)相比中后序是最少花哨.最统一的.一般来说先序遍历的代码 ...

  2. 二叉树遍历的非递归实现

    作者:冯老师,华清远见嵌入式学院讲师. 一.递归的定义及特点 递归是指某个函数直接或间接的调用自身.问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出.递归问题的关 ...

  3. java使用btree_java数据结构之二叉树遍历的非递归实现

    算法概述 递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似. ...

  4. 二叉树遍历(非递归)

    文章目录 二叉树遍历非递归版本 前序遍历 中序遍历 后序遍历 层序遍历 层序遍历+map记录高度 二叉树遍历非递归版本 前序遍历 如果右侧不为空,则右侧进栈,随后是左侧进栈.因为栈是先进后出,所以实现 ...

  5. 二叉树遍历(非递归遍历)

    #include <iostream> #include <vector> #include <stack>using namespace std;//思路分析 / ...

  6. 二叉树 2.0 -- 非递归遍历

    二叉树递归遍历存在的问题 如果我们的二叉树只有左子树,而且树的高度还很深的时候,这个时候递归调用遍历的时候,栈帧空间开辟的较大,很可能造成栈溢出.但是我们一个程序中,为堆分配的空间要比栈大的多,这个时 ...

  7. 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...

    树型分布网络信号放大器 森林和二叉树的相互转换 并查集 例题:File transfer #include <iostream> using namespace std; //typede ...

  8. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...

  9. 对于二叉树三种非递归遍历方式的理解

    利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回):因此,基于其的二叉树遍历操作深刻的体现了其特性: 若后续的输入和其前面的 ...

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

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

最新文章

  1. mvc3 RenderAction传参问题
  2. 独家 | 磁共振斑块成像的技术研发、案例与数据挑战(附视频)
  3. mysql f参数_MySQL 数据类型
  4. Unity5x编辑器的视图二
  5. C++有的地方为什么要类内定义,类外实现(类内声明,类外初始化)?
  6. JVM——对象的创建与内存布局
  7. 2022年第一个线上问题,被领导骂惨了!
  8. linux查看网卡的驱动命令行,linux查看网卡驱动模块信息
  9. C++指针和数组和动态分配内存
  10. 好久不上来,发现这个世界变得真是快啊,都.NET 2.0 AJAX了~~
  11. win8 开发新格局分析
  12. html2canvas提升像素,jspdf + html2canvas 实现html转pdf (提高分辨率版本)
  13. SPD软件(医用耗材管理系统)应用效果分析
  14. appium实现屏幕截图
  15. STK之Commu模块之二-仿真同步卫星与地面站通信显示EIRP分布
  16. CentOS 6.5 Thinkpad 小红点(TrackPoint)设置
  17. 可以在电脑上刷微信朋友圈啦-微信 mac最新版
  18. php 判断某一天是周几,php如何判断一个日期是周几
  19. (三)夯基础——urllib基本库的使用1.0
  20. 163 VIP邮箱如何群发邮件?注册电子邮箱哪家发信效果好?

热门文章

  1. 什么是招聘测评工具?
  2. 魔方最快速识别六面颜色
  3. 植物大战 类和对象 ——C++
  4. Ember恶意软件数据集的使用教程
  5. 传感器技术(徐科军 第四版)第三章:变电抗式传感器
  6. html--P11-P20
  7. 天天预约|新功能工具「美团优惠券」上线啦!
  8. 如何将PDF删除水印?PDF删除水印的方法
  9. ping主机时显示 Request Time Out Destination Unreachable TTL Expired in transit
  10. 关于MySQL联合索引和优化军规