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

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

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

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

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

过程如下:

遍历到当前节点cur时,先遍历左子树收集四个信息,分别是左子树上最大搜索二叉树的头节点(lBST),节点数(lSize),最大值(lMax)和最小值(lMin)。再遍历右子树,也收集四个信息rBST, rSize, rMax, rMin。
根据步骤一收集的信息,判断是否满足情况1,如果满足,返回cur。如果不满足,返回lBST, rBST中最大的一个。

def getMaxLength(root):

    if root == None:
        return 
    record = [root] + [0 for i in range(3)]
    
    return process(record)


def process(record):
    import sys

    if record[0] == None:

        return [None,0,sys.maxsize,-sys.maxsize]

    leftData = process(record[0].left)
    leftSize,leftMax,leftMin = record[1],record[2],record[3]

    rightData = process(record[1].right)
    rightSize,rightMax,rightMin = record[1],record[2],record[3]

    record[1] = max(leftSize,rightSize)
    record[2] = min(min(leftMax,rightMax),int(root.val))
    record[3] = max(max(leftMin,rightMin),int(root.val))

    if rightSize > leftSize:
        root = rightData
    else:
        root = leftData

    if record[0].left == leftData and record[0].right == rightData and leftMax <= int(record[0].val) and rightMin >= int(record[0].val):

        record[1] = leftSize + rightSize + 1
        root = record[0]

    return [root,record[1],record[2],record[3]]


    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值