【算法】重建二叉树
【算法】重建二叉树
1.题目
2.推荐解法
-
代码
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode reConstructBinaryTree(int[] pre, int[] in) { return reConstruct(pre, 0, pre.length - 1, in, 0, in.length - 1); } public TreeNode reConstruct(int[] pre, int preBegin, int preEnd, int[] in, int inBegin, int inEnd) { if (preBegin > preEnd || inBegin > inEnd) return null; TreeNode root = new TreeNode(pre[preBegin]); //找到当前根节点的左子树和右子树的划分位置 int k = inBegin; while (pre[preBegin] != in[k]) k++; //在pre[]中:preBegin+1到preBegin+k-inBegin是左子树的下标 //preEnd-inEnd+k+1到preEnd是右子树的下标 root.left = reConstruct(pre, preBegin + 1, preBegin + k - inBegin, in, inBegin, k - 1); root.right = reConstruct(pre, preEnd - inEnd + k + 1, preEnd, in, k + 1, inEnd); return root; } }
-
我自己写的时候没有考虑到要设置preEnd,导致pre[]数组下标越界。
以及构件左子树时传值preBegin+1,因为pre[]中的节点要依次作为根节点。