二叉樹題型框架2

把題目的要求細化,搞清楚根節點應該作什麼,而後剩下的事情拋給前/中/後序的遍歷框架,千萬不要跳到遞歸的細節裏,相信你的定義java

構造最大二叉樹

選區_165.png
對於構造二叉樹的問題,根節點要作的就是想辦法把本身構造出來
咱們確定要遍歷數組找到最大值maxVal,把根節點root作出來,而後對maxVal左邊的數組和右邊的數組進行遞歸調用,做爲root的左右子樹。
僞代碼數組

TreeNode constructMaxImumBinaryTree(int[] nums){
if(num is empty){
return null;
}

int maxVal=Integer.MIN_VALUE;
int index=0;

for(int i=0;i<nums.length;i++){
if(nums[i]>maxVal){
maxVal=nums[i];
index=i;
     }
}

TreeNode root=new TreeNode(maxVal);
//遞歸調用構造左右子樹
root.left=constructMaximumBinaryTree(nums[0]...index-1);
root.right=constructMaximumBinaryTree(nums[index+1...nums.length-1]);

return root;
}

對於每一個根節點來講,最重要的是找到當前數組中的最大值以及它的索引,而後前序遞歸調用構造子樹框架

//主函數
TreeNode constructMaximumBinaryTree(int[] nums){
return build(nums,0,nums.length-1);
}

TreeNode build(int[] nums,int lo,int hi){
//base case
if(lo>hi){
return null;
}

//找到數組中最大值和對應的索引
int index=-1,maxVal=Integer.MIN_VALUE;
for(int i=lo;i<=hi;i++){
if(maxVal<nums[i]){
maxVal=nums[i];
index=i;
}
}

TreeNode root=new TreeNode(maxVal);
//遞歸調用構造左右子樹
root.left=build(nums,lo,index-1);
root.right=build(nums,index+1,hi);

return root;
}

根據二叉樹的前序遍歷結果和中序遍歷結果來構造二叉樹

這個框架用起來簡直太爽了,咱們須要考慮的是每一個節點須要幹什麼
1.須要建立新節點,根據前序遍歷的結果來找到根節點的值 root.val=preorder[start];
2.咱們還須要肯定左右子樹在數組中的區間,這裏須要添加一個新的變量值,leftNum表明的含義是
子樹在數組中的長度
leftNum=index-start;
而後進行遞歸調用構造左右子樹函數

public TreeNode buildTree(int[] preorder, int[] inorder) {
            return buildTree(preorder,0,preorder.length,inorder,0,inorder.length);
    }
    
    public TreeNode buildTree(int[] preorder,int pre_start,int pre_end,int[] inorder,int in_start,int in_end){
        if(pre_start==pre_end){
            return null;
        }
        
        //前序遍歷
        //構造節點
        int val =preorder[pre_start];
        TreeNode root=new TreeNode(val);
        
        int index=-1;
        for(int i=in_start;i<in_end;i++){
            if(root.val==inorder[i]){
                index=i;
                break;
            }
        }
        
        int leftNum=index-in_start;
        root.left=buildTree(preorder,pre_start+1,pre_start+leftNum+1,inorder,in_start,index);
        root.right=buildTree(preorder,pre_start+leftNum+1,pre_end,inorder,index+1,in_end);
        return root;
    }
相關文章
相關標籤/搜索