问题
给定一个二叉树,求它的最大搜索二叉树的大小
解决思路:
分成三种情况来考虑:
- 当前节点的左子树是搜索二叉树,而右节点并不是搜索二叉树;或者左节点的最大搜索二叉树的大小大于右节点的最大搜索二叉树的大小,那么此时最大的搜索二叉树就是它的左子树;
- 当前节点的右子树是搜索二叉树而左节点不是搜索二叉树;又或者左节点的最大搜索二叉树的大小小于右节点的最大搜索二叉树的大小,那么此时最大的搜索二叉树就是它的右子树;
- 当前节点的左子树和右子树都是搜索二叉树,并且当前节点的值大于左子树的最大搜索二叉树的最大值,小于右子树的最大搜索二叉树的最小值;此时,说明以当前节点为根节点的二叉树也是一颗搜索二叉树;
因为对于每个子树的判断逻辑都一致,可以用递归实现;但需要注意的是要储存的每棵树的信息有四个:
- 当前节点下最大搜索二叉树的最大值
- 当前节点下最大搜索二叉树的最小值
- 最大搜索二叉子树的头结点
- 最大搜索二叉子树的大小(最终需要返回的信息)
代码如下:
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)