剑指 Offer 07. 重建二叉树
剑指 Offer 07. 重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
题解:
1.从前序遍历中我们可以确定的是,树的根节点和左右子树的根节点。
2.利用前序遍历得到的信息,我们可以从中序遍历中根据树的根节点来划分左右子树。
3.因为左右子树已经划分好并且左右子树的根节点也已经知道,所以我们可以开启递归来重构二叉树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int[] preorder;//保存前序遍历
HashMap<Integer, Integer> dic = new HashMap<>();//标记中序遍历的位置
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder=preorder;
for(int i =0;i<inorder.length;i++){
dic.put(inorder[i],i);
}
return recur(0,0,inorder.length-1);//开启递归
}
//root 前序遍历的根节点位置,left左边界,right右边界
TreeNode recur(int root, int left, int right) {
if(left>right) return null;//结束递归
TreeNode node = new TreeNode(preorder[root]);//保存根节点
int i = dic.get(preorder[root]);//划分好左右子树
//左子树的根节点为树根节点在中序遍历的位置+1,
//左子树的左边界不变,
//右边界为中序遍历中树根节点的位置-1
node.left = recur(root+1,left,i-1);
//右子树的根节点为数根节点在中序遍历的位置+左子树节点数量+1,
//右子树的左边界为树根节点在中序遍历的位置+1,
//右子树的右边界不变
node.right = recur(root+i-left+1,i+1,right);
return node;
}
}