力扣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;
	}
}

发布了48 篇原创文章 · 获赞 9 · 访问量 2404

猜你喜欢

转载自blog.csdn.net/jjy19971023/article/details/104765790
今日推荐