【leetcode】每日精選題詳解之654. 最大二元樹

2020-10-12 12:00:15

        嗨,大家好,我是袁廚(因為酷愛做飯,所以自己考取了廚師證)。之前一直看大家寫的部落格,學到了很多東西。然後最近萌生了自己寫的想法,將自己知道的分享給需要的同學。以後每天會為大家分享leetcode精選題目的各種題解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。請大家關注我,一起交流學習吧。


題目描述

在這裡插入圖片描述


遞迴解法

做題思路

這個題目不算太難,主要是不斷求出最大值做為根節點。我們可以通過一下幾步進行構造二元樹

(1)如果陣列大小為零,說明是空陣列
(2)如果不為空,則取陣列中最大的數為根節點,並記錄下該節點的索引。
(3)以該節點為切割點進行切割,分成左陣列和右陣列
(4)遞迴處理左陣列和右陣列

題目程式碼

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
              if(nums.length==0){
                  return null;
              }
              return constructMaximumBinaryTreeFun(nums);

    }
    public TreeNode constructMaximumBinaryTreeFun(int[] nums){
              if(nums.length==0){
                  return null;
              }
              int max = 0;
              int maxindex = 0; 
              //求出最大值,並記錄出最大值下標
              for(int i = 0; i< nums.length;i++){
                  if(nums[i]>max){
                      max = nums[i];
                      maxindex = i;
                  }
              }
              //將最大值設為根節點
              TreeNode root = new TreeNode(max);
              //定義左區間和右區間,大小需要注意一下。
              int[] left = new int[maxindex];
              int[] right = new int[nums.length-maxindex-1];
              //copy原陣列的值,為遞迴做準備
              System.arraycopy(nums,0,left,0,maxindex);
              System.arraycopy(nums,maxindex+1,right,0,nums.length-maxindex-1);
              //遞迴實現
              root.left=constructMaximumBinaryTreeFun(left);
              root.right=constructMaximumBinaryTreeFun(right);
              return root;
    }
}

總結

同學們我最近有了一個長久的計劃,就是把leetcode題目整理出來,由淺入深,由簡到繁都整理出來是一個宏大的工程,所以我打算每天整理一到兩個經典題目,完成這一個流程我相信肯定會收穫巨大的。如果想一起刷題的哥們,我們可以一起在群裡打卡,共同進步。

在這裡插入圖片描述
在這裡插入圖片描述

作者:LeetCode
連結:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。