二叉树的遍历总结
Posted lijianming180
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的遍历总结相关的知识,希望对你有一定的参考价值。
这次首先总结二叉树的前序、中序、后序、层次遍历的递归与非递归实现。
下次总结二叉树的查找、求二叉树的深度、统计节点个数与节点比较的递归实现。
二叉树的结构定义为:
1 2 3 4 5 6 7 8 9 10
| public class { int val; TreeNode left; TreeNode right;
TreeNode(int x) { val = x; } }
|
前序遍历
前序遍历的递归实现,中序遍历、后序遍历的递归实现同理:
1 2 3 4 5 6 7
| public void preOrder(TreeNode t) { if (t != null){ System.out.println(t.val); preOrder(t.left); preOrder(t.right); } }
|
前序遍历的非递归实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public void preOrder(TreeNode t) { Stack<TreeNode> nodeStack = new Stack<>(); TreeNode root = t; while (root != null || !nodeStack.isEmpty()) { while (root != null) { System.out.println(root.val); nodeStack.push(root); root = root.left; } if (!nodeStack.isEmpty()) { root = nodeStack.pop(); root = root.right; } } }
|
中序遍历
中序遍历的递归实现,同理:
1 2 3 4 5 6 7
| public void medOrder(TreeNode t) { if (t != null){ preOrder(t.left); System.out.println(); preOrder(t.right); } }
|
中序遍历的非递归实现,与前序遍历不同的就是在找最左端节点时不输出当前节点:
1 2 3 4 5 6 7 8 9 10 11 12 大专栏 二叉树的遍历总结13 14 15 16 17
| public void medOrder(TreeNode t) { Stack<TreeNode> nodeStack = new Stack<>(); TreeNode root = t; while (root != null || !nodeStack.isEmpty()) { while (root != null) { nodeStack.push(root); root = root.left; } if (!nodeStack.isEmpty()) { root = nodeStack.pop(); System.out.println(root.val); root = root.right; } } }
|
后序遍历
后序遍历的递归实现,同理:
1 2 3 4 5 6 7
| public void postOrder(TreeNode t) { if (t != null){ preOrder(t.left); preOrder(t.right); System.out.println(); } }
|
后序遍历的非递归实现,需要注意的是得先访问父节点的两个子节点之后才能访问父节点,需要使用一个last节点来记录上一次访问的节点,判断是否是当前节点的右子节点,若是,则说明当前左右子树均已访问,则输出当前节点,否则访问其右子树:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public static void postOrder(TreeNode root) { Stack<TreeNode> treeNodeStack = new Stack<TreeNode>(); TreeNode node = root; TreeNode lastVisit = root; while (node != null || !treeNodeStack.isEmpty()) { while (node != null) { treeNodeStack.push(node); node = node.left; } node = treeNodeStack.peek(); if (node.right == null || node.right == lastVisit) { System.out.print(node.val + " "); treeNodeStack.pop(); lastVisit = node; node = null; } else { node = node.right; } } }
|
以上是关于二叉树的遍历总结的主要内容,如果未能解决你的问题,请参考以下文章
最全二叉树的遍历方式总结
算法总结你真的掌握了二叉树的遍历嘛
二叉树的遍历总结
二叉树遍历大总结
二叉树遍历大总结
二叉树总结树的遍历