1373. Maximum Sum BST in Binary Tree

Given a binary tree root, return the maximum sum of all keys of any sub-tree which is also a Binary Search Tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

这道题目是hard 题目。

既然是找BST 树的Max Sum, 那么就一边判断子树是不是BST,一边更新maxSum。

判断子树是不是BST的办法也是用divide conque。一个BST树中序遍历完肯定也是个递增的。

判断左右子树是不是BST。如果其中一个子树不是BST,那这颗子树肯定也不是BST。

如果左右子树都是BST,再判断下root的数值是不是大于左子树的最大node,并且小于右子树的最小node。

这样就能返回到上一层了。

这么看来,必须返回三个元素,min,max以及isBST。

但是对于这个问题来讲,还得多返回一个元素,这颗子树的sum。当这个子树是BST树的时候,动态的更新maxVal。

以下是代码了。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxSum=INT_MIN;
    
    struct retVal {
        int min;
        int max;
        int sum;
        bool isBST;
    };
    
    //pair<int min, int max> 
    struct retVal isBST(TreeNode* root) {
        struct retVal ret;
        if(root == nullptr) {
            ret.min = INT_MAX;
            ret.max = INT_MIN;
            ret.sum = 0;
            ret.isBST = true;
            if (ret.sum > maxSum)
                maxSum = ret.sum;
            
            return ret;
        }
        
        
        struct retVal l, r;
        l = isBST(root->left);
        r = isBST(root->right);
        
                
        if(l.isBST && r.isBST && root->val > l.max && root->val < r.min) {
            ret.min = min(l.min, root->val);
            ret.max = max(r.max, root->val);
            ret.sum = l.sum+r.sum+root->val;
            ret.isBST = true;
            if(ret.sum > maxSum)
                 maxSum = ret.sum;
            return ret;
        }
        else {
            ret.isBST = false;   
        }
        return ret;
    }
    
    int maxSumBST(TreeNode* root) {
        if(root == nullptr)
            return 0;
        
        isBST(root);
        
        if(maxSum < 0)
            maxSum =0;
        return maxSum;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
To convert the given array to a complete BST, we need to perform the following steps: 1. Sort the array in ascending order 2. Construct a complete binary tree using the sorted array 3. Perform inorder traversal of the binary tree and store the elements in the original array in the same order as the traversal Here's the implementation of the to_bst(lst) function in Python: ```python def to_bst(lst): # Sort the input list lst.sort() # Construct a complete binary tree using the sorted list n = len(lst) if n == 0: return lst root = lst[n // 2] left_subtree = to_bst(lst[:n // 2]) right_subtree = to_bst(lst[n // 2 + 1:]) binary_tree = [root] + left_subtree + right_subtree # Perform inorder traversal of the binary tree and store the elements in the original array inorder_traversal(binary_tree, lst, 0) return lst def inorder_traversal(binary_tree, lst, i): # Perform inorder traversal of the binary tree and store the elements in the original array n = len(binary_tree) if i >= n: return inorder_traversal(binary_tree, lst, 2 * i + 1) lst[i] = binary_tree[i] inorder_traversal(binary_tree, lst, 2 * i + 2) ``` The to_bst(lst) function takes in the input list and returns the same list after converting it to a complete BST. The function first sorts the input list in ascending order. It then constructs a complete binary tree using the sorted list by recursively dividing the list into two halves and setting the middle element as the root of the binary tree. Finally, the function performs an inorder traversal of the binary tree and stores the elements in the original list in the same order as the traversal.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值