leetcode105. 从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
这道题我比较喜欢,因为平时对于知道两种顺序再对树进行构造,我只停留在手写,把它实体化成代码花了我不少功夫,主要是我对于边界问题的不敏感,导致右子树的边界判断出了点小问题。
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder){
return dfs(preorder,0,inorder,0,inorder.length-1);
}
public TreeNode dfs(int[] preorder,int i , int[] inorder, int l , int r){
if(l > r)
return null;
int j = l;
for(;j < r ; j++){
if(inorder[j] == preorder[i])
break;
}
TreeNode root =new TreeNode(inorder[j]);
// 左子树 先序遍历下一个永远是子节点,所以 i+1
if(i+1< inorder.length && j-1 >=0){
root.left = dfs(preorder,i+1,inorder,l,j-1);
}
//右子树 i+j-l+1, j-l是左子树的长度,i是根节点,i+j-l在中序遍历中是根节点,+1是右子树的开头
if(i+j-l+1< inorder.length && j+1 < inorder.length){
root.right = dfs(preorder,i+j-l+1,inorder,j+1,r);
}
return root;
}
}