題目:
給定一個不含重複元素的整數數組。一個以此數組構建的最大二叉樹定義如下:
二叉樹的根是數組中的最大元素。
左子樹是通過數組中最大值左邊部分構造出的最大二叉樹。
右子樹是通過數組中最大值右邊部分構造出的最大二叉樹。
通過給定的數組構建最大二叉樹,並且輸出這個樹的根節點。
Example 1:
輸入: [3,2,1,6,0,5]
輸入: 返回下面這棵樹的根節點:
6
/ \
3 5
\ /
2 0
\
1
所用語言:Java
下面是代碼:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
TreeNode root = buildTree(nums,0,nums.length-1);
return root;
}
public TreeNode buildTree(int[] nums, int start, int end){
int index = start;
TreeNode tree = new TreeNode(nums[index]);
//找出最大元素的下標
for(int i=start; i<=end; i++){
if(nums[index] < nums[i]){
index = i;
}
}
tree.val = nums[index];
if(index > start){
tree.left = buildTree(nums,start,index-1);
}
if(index < end){
tree.right = buildTree(nums,index+1,end);
}
return tree;
}
}
思路:
通過題目我們可以知道最大二叉樹的根是這個數組中的最大值。
那麼很明顯首先我們要找出這個數組中的最大值,找到最大值之後就可以構建這棵樹的根節點。
然後把最大值左邊部分拿來構造一個最大二叉樹當作此根節點的左子樹。右子樹同理。在構建左右最大子樹時,就會意識到其實用遞歸可以解決這個問題。
遞歸的結束條件就是當只有一個節點時就直接返回,遞歸的前進條件就是還可以構建子樹時就繼續調用。