最大搜索二叉树的大小

问题

给定一个二叉树,求它的最大搜索二叉树的大小

解决思路:

分成三种情况来考虑:

  1. 当前节点的左子树是搜索二叉树,而右节点并不是搜索二叉树;或者左节点的最大搜索二叉树的大小大于右节点的最大搜索二叉树的大小,那么此时最大的搜索二叉树就是它的左子树;
  2. 当前节点的右子树是搜索二叉树而左节点不是搜索二叉树;又或者左节点的最大搜索二叉树的大小小于右节点的最大搜索二叉树的大小,那么此时最大的搜索二叉树就是它的右子树;
  3. 当前节点的左子树和右子树都是搜索二叉树,并且当前节点的值大于左子树的最大搜索二叉树的最大值,小于右子树的最大搜索二叉树的最小值;此时,说明以当前节点为根节点的二叉树也是一颗搜索二叉树;

因为对于每个子树的判断逻辑都一致,可以用递归实现;但需要注意的是要储存的每棵树的信息有四个:

  • 当前节点下最大搜索二叉树的最大值
  • 当前节点下最大搜索二叉树的最小值
  • 最大搜索二叉子树的头结点
  • 最大搜索二叉子树的大小(最终需要返回的信息)

代码如下:

import sys

class Tree():
    def __init__(self, value):
        self.value = value
        self.right = None
        self.left = None


class Information_of_subTree():
    def __init__(self, max_head, max_value, min_value, length):
        self.max_head = max_head
        self.max_value = max_value
        self.min_value = min_value
        self.length = length

# 主程序
def Biggst_Sub_BST_In_Tree(head):

    res = process(head)

    return res.max_head

# 递归
def process(node):

    if node == None:
        return Information_of_subTree(node, -sys.maxsize-1, sys.maxsize, 0)

    left = process(node.left)
    right = process(node.right)

    # 第三种情况
    if left.max_head == node.left and right.max_head == node.right \
        and left.max_value < node.value and right.min_value > node.value:
        includeItSelf = left.length + 1 + right.length
    else:
        includeItSelf = 0

    max_length = max(left.length, right.length, includeItSelf)

    #判断是第一种还是第二种情况
    max_head = left.max_head if left.length > right.length else right.max_head

    if max_length == includeItSelf : max_head = node

    return Information_of_subTree(max_head, max(left.max_value, right.max_value, node.value),
                                  min(left.min_value, right.min_value, node.value), max_length)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值