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

二叉搜索子树的最大键值和 (思路还是不太顺)

在这里插入图片描述

思路

  1. 判断这颗树是不是二叉搜索树
    1. 它的左右子树是不是二叉搜索树
    2. 左右子树加上自己是不是二叉搜索树
  2. 如果是二叉搜索树,判断结点数之和和最大的值比,获取最大值

所以:
3. 需要判断它的左右子树是不是儿叉搜索树,所以需要一个值isBST
来存储,
4. 要判断它是不是二叉搜索树,就要判断根节点的值是否大于左子树的最大值,且小于右子树的最小值,所以还需要存储每棵树的最大值和最小值,max和min (这里想到的是max是递归找到树的最右结点,min是递归找到树的最左结点,答案的思路还是有点模糊
5. 还要记录这棵树的结点值之和

 var max = 0;
var maxSumBST = function(root) {
      let maxSum = 0;
  /* 返回一个对象,其中属性
  isBST 返回以 root 为根的二叉树是不是 BST 如果是的话则为true 否则为false
  min 返回以 root 为根的这棵 BST 的最小值
  max 返回以 root 为根的这棵 BST 的最大值
  sum 返回以 root 为根的这棵 BST 所有节点之和 
  */
  let dfs = (root) => {
    // base case
    if (root == null) {
      return {
        isBST: true,
        min: Infinity,
        max: -Infinity,
        sum: 0,
      };
    }
    // 递归计算左右子树
    let left = dfs(root.left);
    let right = dfs(root.right);
    if (
      left.isBST &&
      right.isBST &&
      root.val > left.max &&
      root.val < right.min
    ) {
      // 计算以 root 为根的这棵 BST 所有节点之和
      let sum = left.sum + right.sum + root.val;
      maxSum = Math.max(sum, maxSum);
      return {
        // 以root为根的二叉树是BST
        isBST: true,
        // 计算以 root 为根的这棵 BST 的最小值
        min: Math.min(left.min, root.val),
        // 计算以 root 为根的这棵 BST 的最大值
        max: Math.max(right.max, root.val),

        sum,
      };
    } else {
      // 以 root 为根的二叉树不是 BST
      return {
        isBST: false,
      };
    }
  };
  dfs(root);
  return maxSum;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值