剑指 Offer 07. 重建二叉树
难度中等567
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例 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
思路:
-
确定inOrder中各个元素的位置
-
找到preOrder第一个元素即根节点在InOrder中的位置
-
根据preOrder 根左右,Inorder 左根右规律,递归更新左右孩子
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
static HashMap<Integer,Integer>map=new HashMap<>();
static TreeNode build(int[] preorder,int[] inorder,int s1,int e1,int s2,int e2)
{
int rootId=map.get(preorder[s1]);
TreeNode node=new TreeNode(preorder[s1]);
if(rootId>s2)
node.left=build(preorder,inorder,s1+1,s1+rootId-s2,s2,rootId-1);
if(rootId<e2)
node.right=build(preorder,inorder,s1+rootId-s2+1,e1,rootId+1,e2);
return node;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length==0) return null;
//根据inorder节点的位置,判断根节点的位置,然后继续更新左右子树
for(int i=0;i<inorder.length;i++)
map.put(inorder[i],i);
TreeNode root=build(preorder,inorder,0,preorder.length-1,0,inorder.length-1);
return root;
}
}