最大二叉树 II(Java)

最大树定义:一个树,其中每个节点的值都大于其子树中的任何其他值。
给出最大树的根节点 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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值