手动创建一棵二叉树,然后利用前序、中序、后序、层序进行遍历

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Stack;public class BinaryTree {private static class Node{int val;Node left;Node right;Node(int newVal){val = newVal;}}//前序遍历(递归)public static void preOrder(Node node){if(node == null){return;}System.out.print(node.val + " ");preOrder(node.left);preOrder(node.right);}//前序遍历(非递归)//主要的思路:利用栈保存未打印的结点,然后逐个出栈处理,在此过程中更新栈public static void preOrderUnRec(Node node){Stack<Node> stack = new Stack<>();stack.push(node);Node temp;while(!stack.isEmpty()){temp = stack.pop();if(temp != null){  // root == null时,只会空转一个循环,因此无需判断System.out.print(temp.val + " ");stack.push(temp.right);//注意:这里的入栈顺序先是right后leftstack.push(temp.left);// 以保证从栈中取出时为先left后right}}}//中序遍历public static void inOrder(Node node){if(node == null){return;}inOrder(node.left);System.out.print(node.val + " ");inOrder(node.right);}//中序遍历(非递归)public static void inOrderUnRec(Node node){Stack<Node> stack = new Stack<>();Node cur = node;while(cur != null || !stack.isEmpty()){  //当root==null时,不会进入循环,因此无需判断while(cur != null){  //当前结点开始,从上到下将最左边的那一列结点入栈stack.push(cur);cur = cur.left;}cur = stack.pop();   //取出栈顶的结点(该节点左节点为null,因此现在改打印它)System.out.print(cur.val + " ");cur = cur.right;  //定位到已打印的结点的右子结点}}//后序遍历public static void postOrder(Node node){if(node == null){return;}postOrder(node.left);postOrder(node.right);System.out.print(node.val + " ");}//后序遍历(非递归)//主要思路:利用栈保存未打印的结点,然后逐个出栈,进行判断,并根据需要更新栈//        因为处理完左右子树后,再处理根(回溯),所以需要一个记录上一个被打印的结点的引用public static void postOrderUnRec(Node node){if(node == null){return;}Stack<Node> stack = new Stack<>();stack.push(node);//cur:当前结点   pre:上一个被打印的结点Node cur, pre = null;while(!stack.isEmpty()){//查看(你是取出)栈顶的结点cur  = stack.peek();//如果当前结点没有孩子结点(叶子结点)//或者孩子结点都已经被打印过(这里不可能出现有两个子结点却只打印了其中一个的情况)//说明该打印当前结点if((cur.left == null && cur.right == null) || (pre != null && (pre == cur.left || pre == cur.right))){System.out.print(cur.val + " "); //打印当前结点stack.pop();  //被打印的结点(当前结点)出栈pre = cur;   //更新pre的值}else{if(cur.right != null){   //若未轮到当前结点,将当前结点的右子结点、左子节点入栈stack.push(cur.right);//注意:这里的入栈顺序是先right后left}if(cur.left != null){    //以保证从栈中取出时先left后rightstack.push(cur.left);}}}}//层序遍历public static void levelTraversal(Node root){Queue<Node> q = new LinkedList<>();q.add(root);while(!q.isEmpty()){Node temp = q.poll();if(temp != null){System.out.print(temp.val + " ");q.add(temp.left);q.add(temp.right);}}}public static void main(String[] args) {Node node1 = new Node(1);Node node2 = new Node(2);Node node3 = new Node(3);Node node4 = new Node(4);Node node5 = new Node(5);Node node6 = new Node(6);node1.left = node2;node1.right = node3;node2.left = node4;node2.right = node5;node3.left = node6;System.out.println("先序遍历:");preOrder(node1);System.out.println();System.out.println("先序遍历(非递归):");preOrderUnRec(node1);System.out.println();System.out.println("中序遍历:");inOrder(node1);System.out.println();System.out.println("中序遍历(非递归):");inOrderUnRec(node1);System.out.println();System.out.println("后序遍历:");postOrder(node1);System.out.println();System.out.println("后序遍历(非递归):");postOrderUnRec(node1);System.out.println();System.out.println("层序遍历:");levelTraversal(node1);System.out.println();}
}

结果:

先序遍历:
1 2 4 5 3 6
先序遍历(非递归):
1 2 4 5 3 6
中序遍历:
4 2 5 1 6 3
中序遍历(非递归):
4 2 5 1 6 3
后序遍历:
4 5 2 6 3 1
后序遍历(非递归):
4 5 2 6 3 1
层序遍历:
1 2 3 4 5 6

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

  1. 二叉树的前、中、后序遍历

    所谓二叉树遍历是按某种特定规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次.访问结点所做的操作依赖于具体的应用问题. 遍历是二叉树上最重要的运算之一,也是二叉树进行其它运算的基础. 二 ...

  2. 【数据结构与算法】力扣:二叉树的前、中、后序遍历

    递归法 前序遍历 给你二叉树的根节点 root ,返回它节点值的前序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,2,3] 示例 2: 输入:root = [] 输出 ...

  3. 二叉树的前、中、后序遍历的代码实现(递归方式)

    测试的二叉树的结构 root lfb1 rtb1rtb2 控制台输出的遍历结果 ======从根节点开始,前序遍历此二叉树======= root lfb1 rtb1 rtb2 ======从根节点开 ...

  4. 二叉树的前、中、后、层序遍历整理(Java版本)

    源自快手电商一面 package cn.com.codingce.树.遍历;import cn.com.codingce.树.TreeNode;import java.util.ArrayList; ...

  5. 二叉树遍历方法——前、中、后序遍历(图解)

    目录 一.前序遍历 (1)递归版本 (2)非递归版本 二.中序遍历 (1)递归版本 (2)非递归版本 三.后序遍历 (1)递归版本 (2)非递归版本 四.总结 五.测试程序 六.程序输出 二叉树的遍历 ...

  6. java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...

    224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...

  7. 二叉树的前、中、后的非递归遍历

    题目 实现一个链式存储的二叉树,采用非递归的形式,按照前.中.后序的顺序遍历二叉树. 代码 /** * 二叉树的前.中.后序的非递归遍历 **/#include <iostream> us ...

  8. 用前序中序创建二叉树(用中序后序创建二叉树)

    定义二叉树结点 比如就拿这个二叉树 前序中序创建 因为前序遍历的顺序是 根 , 左 ,右. 中序的遍历是 左 根 右. 我们会很不好想,但我们可以用前序和中序把上面那个二叉树的遍历一边 前序遍历:AB ...

  9. C++用类实现二叉树的创建,前序中序后序遍历(附完整代码)

    C++用类实现二叉树的创建,前序中序后序遍历(附完整代码) 前序.中序.后序遍历 直接上代码 前序.中序.后序遍历 二叉树的遍历分为前序遍历,中序遍历和后序遍历三种遍历方法.前序遍历的顺序为" ...

  10. 二叉树题目 ----7 前序中序遍历构造二叉树

    前序中序遍历构造二叉树 思路 在前序中找根结点 根据根结点 + 中序,分成左右两棵子树 根据子树长度,把前序分成左右两颗子树 递归处理子树 /*** Definition for a binary t ...

最新文章

  1. Spring 3.1 事务配置
  2. ISME:根系招募特异型菌群增强植物对盐胁迫的抗性
  3. 【转】汇编语言学习笔记一:CS和IP寄存器
  4. 分块编码(Transfer-Encoding:chunked)
  5. 计算机与环境科学,计算机在环境科学与工程方向的应用
  6. 数据挖掘学习指南!!
  7. 京东抄袭源码;腾讯回应裁员;新 iPad Pro 十月发布 ​| 极客头条
  8. 多传感器数据标定融合完整教程:时间同步+空间同步(Camera+Lidar+IMU+Radar)
  9. C语言中extern 全局变量,二进制文件与内存,static,const对栈,内存的使用情况
  10. 无人机怎么设定航线_飞行航线设置方法及装置与流程
  11. 面试海量数据处理题总结
  12. Spring blunder
  13. cocoa touch
  14. MySQL: Incorrect string value: '\xF0\xA4\xBD\x82'分析解决
  15. native react 折线图_【详解】纯 React Native 代码自定义折线图组件(译)
  16. 英语对于程序员重要吗?
  17. Microsoft PowerToys
  18. MLAPP————第六章 频率派统计
  19. c语言for循环打印菱形五行,用C语言编程 输出五行菱形*。。急需啦。。大神帮忙撒。。。...
  20. 视频H265格式压缩,软件压缩方法,硬件的没有条件,没法测试。

热门文章

  1. 自学必看篇:从零基础到精通的Python学习路线(附加教程)
  2. Docker网络详解——原理篇
  3. gin路由打开html页面,Gin(二):使用路由
  4. python自动退出程序_python异常退出
  5. java反序列化weblogic_[Todo]Java反序列化-weblogic
  6. 关闭eslint检查2020_2020 vscode配置eslint保存后自动fix
  7. uplay服务器未响应,《看门狗:军团》存在崩溃丢失存档BUG 育碧正在修复
  8. mysql group by 天_MySQL group by语句如何优化
  9. 2020年生肖码表图_2020年最好的计时码表,是这4款
  10. 为什么yamlp中没有cplex_在《英雄联盟》中,为什么有些T1英雄并没有我们想象中那么强势?...