二叉树问题---找到二叉树中的最大搜索二叉子树

给定一个所有节点值都不一样的二叉树,找出含有最多节点的搜索二叉子树。最大搜索二叉树可能来自两种情况:1. 左右子树都是搜索二叉树,且左子树最大值小于节点值,右子树最小值大于节点值;2. 若不满足情况1,则从左子树或右子树的最大搜索二叉子树中选择。通过后序遍历并收集相关信息来实现。
摘要由CSDN通过智能技术生成

题目:
  给定一棵二叉树的头节点head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉树,并返回这棵子树的头节点。(注意子树的概念)

基本思路:
以节点node为头的树中,最大的搜索二叉树只可能来自以下的两种情况:  

  1. node的左子树和右子树都是搜索二叉树,并且左子树的最大值小于node,右子树的最小值大于node,此时,以node为头的整棵树都是搜索二叉树。
  2. 如果不满足情况1,那么最大的搜索二叉树来自node左子树的最大搜索二叉子树或者node右子树的最大搜索二叉子树

整体过程是二叉树的后序遍历,过程如下:

  1. 遍历到当前节点cur时,先遍历左子树收集四个信息,分别是左子树上最大搜索二叉树的头节点(lBST),节点数(lSize),最大值(lMax)和最小值(lMin)。再遍历右子树,也收集四个信息rBST, rSize, rMax, rMin。
  2. 根据步骤一收集的信息,判断是否满足情况1,如果满足,返回cur。如果不满足,返回lBST, rBST中最大的一个。
def biggestSubBST(root):
    def findBiggestSubBST(root, record):
        if not root:
            record[0] = 0
            record[1] = sys.maxsize
            record[2] = -sys.maxsize
            return None
        leftBST = findBiggestSubBST(root.left, record)
        leftSize = record[0]
        leftMin = record[1]
        leftMax = record[2]
        rightBST = findBiggestSubBST(root.right, record)
        rightSize = record[0]
        rightMin = record[1]
        rightMax = record[2]
        record[1] = min(leftMin, int(root.val))
        record[2] = max(rightMax, int(root.val))
        if leftBST == root.left and rightBST == root.right and \
                rightMin > int(root.val) and leftMax < int(root.val):
            record[0] = leftSize + rightSize + 1
            return root
        record[0] = max(leftSize, rightSize)
        if leftSize > rightSize:
            return leftBST
        else:
            return rightBST

    if not root:
        return
    record = [0 for i in range(3)]
    return findBiggestSubBST(root, record)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值