文章目录
- 前言
- 1. 中左右进行遍历:
- 2. 代码实现
- 二、中序
- 1. 左中右进行遍历
- 2. 代码实现
- 三、后序
- 1. 左右中进行遍历
- 2. 代码实现
- 四、逆推二叉树
前言
二叉树一遍有前序、中序和后序三种遍历方式,不同的遍历方式有不同的用处。
二叉树遍历都是先左后右的。
二叉树类:
public class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode() {}public TreeNode(int val) {this.val = val;}public TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}
构建这颗树:
TreeNode root = new TreeNode(4);TreeNode temp1 = new TreeNode(1);TreeNode temp2 = new TreeNode(2);TreeNode temp3 = new TreeNode(3);TreeNode temp5 = new TreeNode(5);root.left = temp2;root.right = temp5;temp2.right = temp3;temp2.left = temp1;
一、前序
1. 中左右进行遍历:
- 遍历根节点
- 遍历根节点的左节点(如果左节点不是叶子节点,则以当前节点开始,重新从第一步开始)
- 遍历根节点的右节点(如果右节点不是叶子节点,则以当前节点开始,重新从第一步开始)
2. 代码实现
public void pre(TreeNode root) {if (root == null)return;System.out.print(root.val);pre(root.left);pre(root.right);}
结果为42135
二、中序
1. 左中右进行遍历
- 遍历根节点的左节点(如果左节点不是叶子节点,则以当前节点开始,重新从第一步开始)
- 遍历根节点
- 遍历根节点的右节点(如果右节点不是叶子节点,则以当前节点开始,重新从第一步开始)
2. 代码实现
public static void cur(TreeNode root) {if (root == null)return;cur(root.left);System.out.print(root.val);cur(root.right);}
结果为:12345
三、后序
1. 左右中进行遍历
- 遍历根节点的左节点(如果左节点不是叶子节点,则以当前节点开始,重新从第一步开始)
- 遍历根节点的右节点(如果右节点不是叶子节点,则以当前节点开始,重新从第一步开始)
- 遍历根节点
2. 代码实现
public static void nxt(TreeNode root) {if (root == null)return;nxt(root.left);nxt(root.right);System.out.print(root.val);}
结果为:13254
四、逆推二叉树
- 前序加中序可以逆推二叉树;
//记录前序中的位置int key = 0;public TreeNode buildTree(int[] preorder, int[] inorder) {return function(preorder,inorder,0,inorder.length - 1);}public TreeNode function(int[] preorder, int[] inorder,int left,int right){if (left == right){TreeNode node = new TreeNode(preorder[key]);key++;return node;} else if (left > right)return null;int rootIndex = 0;for (int i = left; i <= right; i++) {if (inorder[i] == preorder[key]){rootIndex = i;break;}}TreeNode node = new TreeNode(preorder[key]);key++;node.left = function(preorder,inorder,left,rootIndex - 1);node.right = function(preorder, inorder, rootIndex+1, right);if (node.left == node.right)key--;return node;}
- 后序加中序可以逆推二叉树;
- 前序加后序不能逆推二叉树;