Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal
题目链接: Construct Binary Tree from Preorder and Inorder Traversal
难度:Medium
题目大意:
根据一棵二叉树中序遍历和前序遍历的结果恢复出二叉树。
思路:
这道题与leetcode上另一道题很像,参考我的另一篇博文Leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal(详细解析)。preorder的第一个元素就是二叉树的根节点,找到根节点在inorder中的位置,inorder中根节点左边的所有元素就是根节点的左子树的所有元素,右边的所有元素就是右子树的所有元素。再把左子树和右子树看成新的二叉树,重复以上步骤进行递归。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
Map<Integer,Integer> map=new HashMap<>();
int index;//根节点在preorder中的位置
public TreeNode buildTree(int[] preorder, int[] inorder) {
int n=preorder.length;
for(int i=0;i<n;i++){
map.put(inorder[i],i);
}
index=0;
return help(0,n-1,preorder);
}
public TreeNode help(int left,int right,int[] preorder){
if(left>right){
return null;
}
TreeNode root=new TreeNode(preorder[index]);
index++;
int rootIndex=map.get(root.val);//根节点在inorder中的位置
root.left=help(left,rootIndex-1,preorder);//先构造左子树
root.right=help(rootIndex+1,right,preorder);
return root;
}
}