二叉搜索子树的最大键值和

二叉搜索子树的最大键值和(困难)

题目:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路分析

  1. 题目要求返回任意二叉搜索子树的最大键值和,显然,这题的思路就是围绕子树是否是BST树的遍历方式展开,提到树,不可避免的想到了递归。
  2. 首先,判断以node节点为根的树是否是二叉搜索树主要有以下步骤:
    1. 以node节点的左右子节点为根的树是否是BST。
    2. 左子树的最大值小于node.val && 右子树的最小值大于node.val。
  3. 其次,要获取最大键值和,那么最好选择后序遍历,这样就能够获得左右子节点遍历后返回的结果集。

实现

class Solution {
    int maxSum = 0;

    public int maxSumBST(TreeNode root) {
        traverse(root);
        return maxSum;
    }

    //int[0]:是否是BST,1是,0不是
    //int[1]:以node为根的二叉树中节点的最小值
    //int[2]:以node为根的二叉树中节点的最大值
    //int[3]:BST节点值之和
    private int[] traverse(TreeNode node) {
        if (node == null) {
            return new int[]{1, Integer.MAX_VALUE, Integer.MIN_VALUE, 0};
        } else if(node.left == null && node.right == null) {
            //当前节点是叶子节点
            maxSum = Math.max(maxSum, node.val);
            return new int[]{1, node.val, node.val, node.val};
        }

        int[] left = traverse(node.left);
        int[] right = traverse(node.right);

        int[] res = new int[4];
        if (left[0] == 1 && right[0] == 1) {
            //左右子树都是BST
            if (left[2] < node.val && right[1] > node.val) {
                //左子树的最大值小于node的值,右子树的最小值大于node的值,则以node节点为根的树是BST
                res[0] = 1;
                res[1] = Math.min(left[1], node.val);
                res[2] = Math.max(right[2], node.val);
                res[3] = left[3] + right[3] + node.val;
                maxSum = Math.max(maxSum, res[3]);
                return res;
            }
        }
        res[0] = 0;
        return res;
    }   
}

代码解析

  1. maxSum初始化为0,根据示例3可知本题要求的监制和最小要求为0。
  2. 遍历时,首先要判断node是否是null,防止递归遍历时产生空指针异常。认为node是BST(如下图),并且返回最值时使用Integer.MAX_VALUE,对后续判断树的最值不会产生影响(如下图情况时,以4为根的树满足BST条件,当node.val == 5时,比较的是最小值,所以不会产生影响,其余位置同理分析即可),键值和为0,即不为后续的键值和产生影响。
    在这里插入图片描述
  3. 如果node是叶子节点,那么node一定是BST。
  4. 如果以node为根的树不是BST,只需要res[0] = 0即可,其余值并不会被使用到。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值