概述

二叉树的遍历主要有前序遍历、中序遍历、后序遍历、层次遍历
前三种遍历常见考察点是递归遍历、非递归遍历、moriss遍历,层次遍历的考察点是:是否分层打印。

代码

递归遍历(前序、中序、后序),包含***由数组构造二叉树***:

package 二叉树的遍历;//二叉树遍历的递归实现
import java.util.LinkedList;
import java.util.List;public class SearchTree {private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };private static List<TreeNode> TreeNodeList = null;/*** 内部类:节点*/private static class TreeNode {TreeNode leftChild;TreeNode rightChild;int data;TreeNode(int newData) {leftChild = null;rightChild = null;data = newData;}}public void createBinTree() {TreeNodeList = new LinkedList<TreeNode>(); //多个TreeNode组成的链表容器// 将一个数组的值依次转换为TreeNode节点for (int TreeNodeIndex = 0; TreeNodeIndex < array.length; TreeNodeIndex++) {TreeNodeList.add(new TreeNode(array[TreeNodeIndex]));}// 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {// 左孩子TreeNodeList.get(parentIndex).leftChild = TreeNodeList.get(parentIndex * 2 + 1);// 右孩子TreeNodeList.get(parentIndex).rightChild = TreeNodeList.get(parentIndex * 2 + 2);}// 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理int lastParentIndex = array.length / 2 - 1;// 左孩子TreeNodeList.get(lastParentIndex).leftChild = TreeNodeList.get(lastParentIndex * 2 + 1);// 右孩子,如果数组的长度为奇数才建立右孩子if (array.length % 2 == 1) {TreeNodeList.get(lastParentIndex).rightChild = TreeNodeList.get(lastParentIndex * 2 + 2);}}/*** 先序遍历** 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已** @param TreeNode*            遍历的节点*/public static void preOrderTraverse(TreeNode TreeNode) {if (TreeNode == null)return;System.out.print(TreeNode.data + " ");preOrderTraverse(TreeNode.leftChild);preOrderTraverse(TreeNode.rightChild);}/*** 中序遍历** 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已** @param TreeNode*            遍历的节点*/public static void inOrderTraverse(TreeNode TreeNode) {if (TreeNode == null)return;inOrderTraverse(TreeNode.leftChild);System.out.print(TreeNode.data + " ");inOrderTraverse(TreeNode.rightChild);}/*** 后序遍历** 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已** @param TreeNode*            遍历的节点*/public static void postOrderTraverse(TreeNode TreeNode) {if (TreeNode == null)return;postOrderTraverse(TreeNode.leftChild);postOrderTraverse(TreeNode.rightChild);System.out.print(TreeNode.data + " ");}public static void main(String[] args) {SearchTree binTree = new SearchTree();binTree.createBinTree();// TreeNodeList中第0个索引处的值即为根节点TreeNode root = TreeNodeList.get(0);System.out.println("先序遍历:");preOrderTraverse(root);System.out.println();System.out.println("中序遍历:");inOrderTraverse(root);System.out.println();System.out.println("后序遍历:");postOrderTraverse(root);}}

层次遍历

package 二叉树的遍历;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;public class 层次遍历 {public static void main(String[] args) {TreeNode head = new TreeNode(3);head.left = new TreeNode(9);head.right = new TreeNode(20);head.right.left = new TreeNode(15);head.right.right = new TreeNode(7);levelIterator(head);}public static void levelIterator(TreeNode root) {if (root == null) {return;}LinkedList<TreeNode> queue = new LinkedList<TreeNode>();TreeNode current = null;queue.offer(root);//将根节点入队while (!queue.isEmpty()) {current = queue.poll();//出队队头元素并访问System.out.print(current.val + "-->");if (current.left != null)//如果当前节点的左节点不为空入队{queue.offer(current.left);}if (current.right != null)//如果当前节点的右节点不为空,把右节点入队{queue.offer(current.right);}}}
}

非递归遍历

List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<Integer>();if (root == null)return result;Stack<TreeNode> stack = new Stack<TreeNode>();stack.push(root);while (!stack.isEmpty()) {TreeNode node = stack.pop();result.add(node.val);if (node.right != null)stack.push(node.right);if (node.left != null)stack.push(node.left);}return result;
}List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<Integer>();if (root == null)return result;Stack<TreeNode> stack = new Stack<TreeNode>();TreeNode p = root;while (p != null || !stack.isEmpty()) {if (p != null) {stack.push(p);p = p.left;} else {p = stack.pop();result.add(p.val);p = p.right;}}return result;
}List<Integer> postorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<Integer>();if (root == null)return result;Stack<TreeNode> stack = new Stack<TreeNode>();TreeNode p = root;TreeNode last = null;while (p != null || !stack.isEmpty()) {if (p != null) {stack.push(p);p = p.left;} else {TreeNode peek = stack.peek();if (peek.right != null && last != peek.right) {p = peek.right;} else {peek = stack.pop();result.add(peek.val);last = peek;}}}return result;
}

MORISS遍历

public class Code_01_MorrisTraversal {public static class Node {public int value;Node left;Node right;public Node(int data) {this.value = data;}}public static void morrisIn(Node head) {if (head == null) {return;}Node cur1 = head;Node cur2 = null;while (cur1 != null) {cur2 = cur1.left;if (cur2 != null) {while (cur2.right != null && cur2.right != cur1) {cur2 = cur2.right;}if (cur2.right == null) {cur2.right = cur1;cur1 = cur1.left;continue;} else {cur2.right = null;}}System.out.print(cur1.value + " ");cur1 = cur1.right;}System.out.println();}public static void morrisPre(Node head) {if (head == null) {return;}Node cur1 = head;   // 当前节点Node cur2 = null;    // 当前节点的最右节点while (cur1 != null) {cur2 = cur1.left;if (cur2 != null) {while (cur2.right != null && cur2.right != cur1) {cur2 = cur2.right;  //找到最右}if (cur2.right == null) {cur2.right = cur1;System.out.print(cur1.value + " ");cur1 = cur1.left;continue;} else {cur2.right = null;}} else {System.out.print(cur1.value + " ");}cur1 = cur1.right;}System.out.println();}public static void morrisPos(Node head) {if (head == null) {return;}Node cur1 = head;Node cur2 = null;while (cur1 != null) {cur2 = cur1.left;if (cur2 != null) {while (cur2.right != null && cur2.right != cur1) {cur2 = cur2.right;}if (cur2.right == null) {cur2.right = cur1;cur1 = cur1.left;continue;} else {cur2.right = null;printEdge(cur1.left);}}cur1 = cur1.right;}printEdge(head);System.out.println();}public static void printEdge(Node head) {Node tail = reverseEdge(head);Node cur = tail;while (cur != null) {System.out.print(cur.value + " ");cur = cur.right;}reverseEdge(tail);}public static Node reverseEdge(Node from) {Node pre = null;Node next = null;while (from != null) {next = from.right;from.right = pre;pre = from;from = next;}return pre;}// for test -- print treepublic static void printTree(Node head) {System.out.println("Binary Tree:");printInOrder(head, 0, "H", 17);System.out.println();}public static void printInOrder(Node head, int height, String to, int len) {if (head == null) {return;}printInOrder(head.right, height + 1, "v", len);String val = to + head.value + to;int lenM = val.length();int lenL = (len - lenM) / 2;int lenR = len - lenM - lenL;val = getSpace(lenL) + val + getSpace(lenR);System.out.println(getSpace(height * len) + val);printInOrder(head.left, height + 1, "^", len);}public static String getSpace(int num) {String space = " ";StringBuffer buf = new StringBuffer("");for (int i = 0; i < num; i++) {buf.append(space);}return buf.toString();}public static void main(String[] args) {Node head = new Node(4);head.left = new Node(2);head.right = new Node(6);head.left.left = new Node(1);head.left.right = new Node(3);head.right.left = new Node(5);head.right.right = new Node(7);printTree(head);morrisIn(head);morrisPre(head);morrisPos(head);printTree(head);}}

二叉树的遍历(前序、中序、后序、层次)相关推荐

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

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

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

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

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

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

  4. 二叉树的前、中、后、层次非递归遍历(js)

    有如下二叉树  遍历: // 前序遍历, head-left-rightfunction HLR (tree) {const stack = [], res = []if (tree) stack.p ...

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

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

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

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

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

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

  8. 二叉树前序遍历python输出_[宜配屋]听图阁 - Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例...

    本文实例讲述了Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作.分享给大家供大家参考,具体如下: 实现一个功能: 输入:一颗二叉树的先序和中序遍历 输出:后续遍历 思想: 先序遍历中,第 ...

  9. 二叉树的前序中序后序遍历

    二叉树的前序中序后序遍历 二叉树的遍历 前序遍历 中序遍历 后序遍历 总结 二叉树的遍历 二叉树的遍历有前序遍历,中序遍历,后序遍历三种. 今天我把二叉树的遍历方法给大家总结一下,也算对我自己学习的一 ...

  10. 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

最新文章

  1. locate 命令详解
  2. maven 无效的源发行版11
  3. 猜数游戏 (10 分)
  4. ls命令 文件和目录属性
  5. Python入门教程丨1300多行代码,让你轻松掌握基础知识点
  6. Nginx之11吸星大法 - (页面缓存) 1
  7. 【Prison Break】第三天(3.29)
  8. python爬取股票历史数据_爬取股票历史数据并绘制K线图
  9. 良心推荐11款可以称得上“神器”的Windows工具集合
  10. oracle导入源数据库文件,将dmp文件数据导入oracle数据库
  11. html中ul和li是什么单位,html中ul,ol和li的区别
  12. 计算机硬件的五个功能部件及其功能
  13. 我实现的一些Abp模块
  14. 欢迎来怼——第四次Scrum会议
  15. uni-app注册 page-head
  16. 交通运输词汇(zt)
  17. 阿里云天池大赛赛题(机器学习)——工业蒸汽量预测(完整代码)
  18. Linux(CentOS)下安装NVIDIA GPU驱动
  19. 黑马前端笔记1--HTML(1)
  20. C语言余数为0输出intact,C语言中的宏是怎么展开的?

热门文章

  1. NC 完工报检单 推单 产成品入库单 批次问题
  2. 考研完形填空 方法技巧*
  3. 数学题 识别 批改 python_准确率99.9%!AI批改数学题,误判率仅为人工1/10,计算填空应用题都能批改...
  4. 暗影格斗3显示无服务器,暗影格斗3总是显示无法连接网络
  5. QT安装段错误segmentation fault
  6. gradient clipping
  7. python核心数据类型——数值、字符串和列表的基本操作
  8. 数据分析——Kettle插件开发异常信息总结
  9. POJ2404:Jogging Trails
  10. 3dmax入门教程(一)