力扣654、最大二叉樹&&&力扣998、最大二叉樹二。。。。

給定一個不含重複元素的整數數組。一個以此數組構建的最大二叉樹定義如下:
二叉樹的根是數組中的最大元素。
左子樹是通過數組中最大值左邊部分構造出的最大二叉樹。
右子樹是通過數組中最大值右邊部分構造出的最大二叉樹。
通過給定的數組構建最大二叉樹,並且輸出這個樹的根節點。 
示例 :
輸入:[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;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章