最大树定义:一个树,其中每个节点的值都大于其子树中的任何其他值。
给出最大树的根节点 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)。
package com.loo;
public class MaxBinaryTreeII {
public static void main(String[] args) {
TreeNode root = new TreeNode(4);
TreeNode left1 = new TreeNode(1);
TreeNode right1 = new TreeNode(3);
TreeNode right2 = new TreeNode(2);
root.left = left1;
root.right = right1;
right1.left = right2;
int n = 5;
TreeNode r1 = maxBinaryTreeII(root , n);
printTreeNode(r1);
System.out.println("++++++++++++++++++++++");
TreeNode root2 = new TreeNode(5);
TreeNode left21 = new TreeNode(2);
TreeNode right21 = new TreeNode(4);
TreeNode left22 = new TreeNode(1);
root2.left = left21;
root2.right = right21;
left21.right = left22;
int n2 = 3;
TreeNode r2 = maxBinaryTreeII(root2 , n2);
printTreeNode(r2);
System.out.println("++++++++++++++++++++++");
TreeNode root3 = new TreeNode(5);
TreeNode left31 = new TreeNode(2);
TreeNode right31 = new TreeNode(3);
TreeNode left32 = new TreeNode(1);
int n3 = 4;
root3.left = left31;
root3.right = right31;
left31.right = left32;
TreeNode r3 = maxBinaryTreeII2(root3 , n3);
printTreeNode(r3);
System.out.println("++++++++++++++++++++++");
}
public static TreeNode maxBinaryTreeII(TreeNode root , int value) {
if (root == null || value > root.value ) {
TreeNode temp = new TreeNode(value);
temp.left = root;
return temp;
}
TreeNode right = maxBinaryTreeII(root.right , value);
root.right = right;
return root;
}
static class TreeNode {
int value;
TreeNode left;
TreeNode right;
TreeNode(int v) {
value = v;
}
}
public static void printTreeNode(TreeNode root) {
if (root!=null) {
System.out.println(root.value);
printTreeNode(root.left);
printTreeNode(root.right);
}
}
public static TreeNode maxBinaryTreeII2(TreeNode root , int value) {
if (root == null) {
root = new TreeNode(value);
return root;
}
TreeNode node = root;
if (value > node.value) {
root = new TreeNode(value);
root.left = node;
return root;
}
// 与根节点的右子树根节点比较,直到出现:无右子树,或者右子树根节点小于 新增值
while (node.right != null && node.right.value > value) {
node = node.right;
}
if (node.right == null) { // 无右子树
node.right = new TreeNode(value);
} else { // 右子树根节点小于 新增值
TreeNode temp = new TreeNode(value);
temp.left = node.right;
node.right = temp;
}
return root;
}
}