剑指 Offer 07. 重建二叉树(7.27)
剑指 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]
限制:
0 <= 节点个数 <= 5000
解答
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
// 保存前序遍历数组
int[] pre;
// 后续遍历放入Map方便快速查找节点所在索引
Map<Integer,Integer> map=new HashMap();
public TreeNode buildTree(int[] preorder, int[] inorder) {
// 保存前序遍历为全局变量
this.pre=preorder;
// 后续遍历放入Map
for(int i=0;i<inorder.length;i++)
map.put(inorder[i],i);
// 传入第一个根节点,开始递归
return rebuildTree(0,0,inorder.length-1);
}
// 根节点前序遍历索引,中序遍历中的左边界和右边界
public TreeNode rebuildTree(int root,int i_left,int i_right) {
// 递归终点,相等的时候即为自己,表示此子树只有一个节点
if(i_left>i_right)
return null;
// 建立根节点
TreeNode node=new TreeNode(pre[root]);
// 找到根节点值在中序遍历中的位置
int i=map.get(pre[root]);
// 左子树的值为左子树的第一个根节点
node.left=rebuildTree(root+1,i_left,i-1);
// 右子树的值为右子树的第一个根节点,右子树的根节点索引为根节点索引加上左子树长度+1
node.right= rebuildTree(root+1+i-i_left,i+1,i_right);
return node;
}
}