重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
根据前序和中序确定二叉树,根据它们的特性,可知前序第一个元素是根节点,和中序对应找出各自的左子树和右子树。
然后递归循环,在找相同的元素,此为子树的根节点,然后继续操作,直到子树为空。
Arrays.copyOfRange(byte[] original, int from, int to)是对数组的指定位置的复制。
下面是实现的代码:
1 /** 2 * Definition for binary tree 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 import java.util.*; 11 12 public class Solution { 13 public TreeNode reConstructBinaryTree(int[] pre, int[] in) { 14 if (pre == null || in == null || pre.length == 0 || in.length == 0) { 15 return null; 16 } 17 TreeNode root = construct(pre, in); 18 return root; 19 } 20 21 private TreeNode construct(int[] pre, int[] in) { 22 int length = pre.length; 23 if (length == 0) 24 return null; 25 TreeNode root = new TreeNode(pre[0]); 26 int i = 0; 27 for (; i < length; i++) { 28 if (in[i] == pre[0]) 29 break; 30 } 31 if (i == length) 32 i--; 33 int[] leftPre = Arrays.copyOfRange(pre, 1, i + 1); 34 int[] rightPre = Arrays.copyOfRange(pre, i + 1, length); 35 int[] leftIn = Arrays.copyOfRange(in, 0, i); 36 int[] rightIn = Arrays.copyOfRange(in, i + 1, length); 37 root.left = construct(leftPre, leftIn); 38 root.right = construct(rightPre, rightIn); 39 return root; 40 } 41 }
心有猛虎,细嗅蔷薇 转载请注明:https://www.cnblogs.com/ygh1229/