剑指 Offer 07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output:[3,9,20,null,null,15,7]
示例 2:Input: preorder = [-1], inorder = [-1] Output: [-1]
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof
思路:
确定根节点,即preorder(前序遍历)的第一个元素,如示例1中的‘3’。
以inorder(中序遍历)为标准,通过其中的元素‘3’,将剩余分为左右两分支。左分支元素[3],右分支元素[15,20,7]。同时得到左右分支的前序遍历和中序遍历。
通过递归,将左右分支重复上段的步骤。
其核心是找出根节点,确定左右分支。
代码:
static class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
int length = preorder.length;
if (length == 0) return null;
TreeNode root = new TreeNode(preorder[0]);
int index = 0;
for (int i = 0; i < inorder.length; i++) {
if (inorder[i] == root.val){
index = i;
}
}
root.left = buildTree(Arrays.copyOfRange(preorder,1,index+1),Arrays.copyOfRange(inorder,0,index));
root.right = buildTree(Arrays.copyOfRange(preorder,index+1,length),Arrays.copyOfRange(inorder,index+1,length));
return root;
}
}
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}