給定一個不含重複元素的整數數組。一個以此數組構建的最大二叉樹定義如下:
二叉樹的根是數組中的最大元素。
左子樹是通過數組中最大值左邊部分構造出的最大二叉樹。
右子樹是通過數組中最大值右邊部分構造出的最大二叉樹。
通過給定的數組構建最大二叉樹,並且輸出這個樹的根節點。
示例 :
輸入:[3,2,1,6,0,5]
輸出:返回下面這棵樹的根節點:
6
/ \
3 5
\ /
2 0
\
1
提示:
給定的數組的大小在 [1, 1000] 之間。
此題的解題方法在於迭代,選擇出當前左右區間內的最大元素當做根節點,然後迭代出左子樹和右子樹即可,但是有一個操作的細節問題
我們在找最大值的時候,不可以動數組的內容,也需要記錄最大值的位置,笨拙的方法是先找最大值,再找位置。但是我們可以直接找到最大值的位置。
代碼如下:
public class MaximunBiTree {
public TreeNode constructMaximumBinaryTree(int[] nums) {
if (nums.length == 0)
return null;
else
return ca(nums, 0, nums.length - 1);
}
public TreeNode ca(int[] nums, int l, int r) {
if (l > r)
return null;
if (l == r)
return new TreeNode(nums[l]);
int mid = l;// 直接找到最大值位置就好了
for (int i = l; i <= r; i++) {
if (nums[mid] < nums[i])
mid = i;
}
TreeNode root = new TreeNode(nums[mid]);
root.right = ca(nums, mid + 1, r);
root.left = ca(nums, l, mid - 1);
return root;
}
public static void main(String[] args) {
}
}
最大樹定義:一個樹,其中每個節點的值都大於其子樹中的任何其他值。
給出最大樹的根節點 root。
就像之前的問題那樣,給定的樹是從表 A(root = Construct(A))遞歸地使用下述 Construct(A) 例程構造的:
如果 A 爲空,返回 null
否則,令 A[i] 作爲 A 的最大元素。創建一個值爲 A[i] 的根節點 root
root 的左子樹將被構建爲 Construct([A[0], A[1], ..., A[i-1]])
root 的右子樹將被構建爲 Construct([A[i+1], A[i+2], ..., A[A.length - 1]])
返回 root
請注意,我們沒有直接給定 A,只有一個根節點 root = Construct(A).
假設 B 是 A 的副本,並附加值 val。保證 B 中的值是不同的。
返回 Construct(B)。
示例 1:
輸入:root = [4,1,3,null,null,2], val = 5
輸出:[5,4,null,1,3,null,null,2]
解釋:A = [1,4,2,3], B = [1,4,2,3,5]
示例 2:
輸入:root = [5,2,4,null,1], val = 3
輸出:[5,2,4,null,1,null,3]
解釋:A = [2,1,5,4], B = [2,1,5,4,3]
示例 3:
輸入:root = [5,2,3,null,1], val = 4
輸出:[5,2,4,null,1,3]
解釋:A = [2,1,5,3], B = [2,1,5,3,4]
提示:
1 <= B.length <= 100
先做第一題,再回來做這個你會發現真TM簡單。不要學我隨機做題目。。。。然後回去做第一題去了
難受
總體來說,就是把新數加到第一題數組的最後,也就是插入根節點的右子樹
一共就這三種情況。
1、他比根節點大,那麼整個樹都是其左子樹
2、然後呢,我們判斷下,若是他比最後一個節點小,那麼自然的成爲最後一個節點的右孩子。
3、是他比最後一個節點大,那麼好了,我們要找到他比右邊到底哪個節點小,
找到比他大的那個節點,由於他在數組中的順序在這個節點右邊,所以他要成爲比他大的節點的右孩子,並把原來的那一坨右孩子變爲自己的左孩子即可。
代碼如下
public class insertIntoMTree {
public TreeNode insertIntoMaxTree(TreeNode root, int val) {
if (root == null)
return new TreeNode(val);
else if (root == null || root.val < val) {// 若是自己比根節點都大,那麼樹變爲自己的左孩子
TreeNode temp = new TreeNode(val);
temp.left = root;
return temp;
}
TreeNode root1 = root;
TreeNode root2 = root;
while (root1 != null && root1.val > val) {
if (root1.right != null && root1.right.val > val) {
root1 = root1.right;// 因爲是最後一個數組的值,那麼他必然是樹的右邊的節點
} else {
break;
}
}
if (root1.right == null && root1.val > val) {
root1.right = new TreeNode(val);// 若是節點的右孩子空啦且自己比該節點小,那麼好了,直接插入吧
} else if (root1.right != null && root1.right.val < val) {
root2 = root1.right;// 否則就是自己比最後一個節點大,那麼要修改指針,最後變爲非葉節點,原來的一坨,變爲自己的左孩子
root1.right = new TreeNode(val);
root1.right.left = root2;
}
return root;
}
}