题目:
给定一个头节点head,已知所有节点的值都不一样,返回其中最大的且符合搜索二叉树条件的最大拓扑结构的大小
方法一:二叉树节点数为N,时间复杂度为O(N^2)的方法
class Node:
def __init__(self,value):
self.value = value
self.left = None
self.right = None
def getTopSize1(head):
if head == None:
return 0
max_ = max(getTopSize1(head.left),maxTopo(head,head))
max_ = max(getTopSize1(head.right),maxTopo(head,head))
return max_
def maxTopo(head,node):
if head!=None and node!=None and isBSTnode(head,node,node.value):
rerturn maxTopo(head,node.left) + maxTopo(head,node.right) + 1
def isBSTnode(head,node,value):
if head == None:
return False
if head == node:
return True
if head.value > value:
return isBSTnode(head.left,node,value)
else:
return isBSTnode(head.right,node,value)
方法2 二叉树的节点数为N,时间复杂度为O(N)的方法
class Record:
def __init__(self,left,right):
self.l = left
self.r = right
def bstTopoSize2(head):
map_ = {}
return posOrder(head,map_)
def posOrder(head,map_):
if head == None:
return 0
ls = preOrder(head.left,map_)
rs = preOrder(head.right,map_)
modifyMap(head.left,head.value,map_,True)
modifyMap(head.right,head.value,map_,False)
lr = map_[head.left]
rr = map_[head.right]
if lr == None:
lbst = 0
else:
lbst = lr.l + lr.r + 1
if rr == None:
rbst = 0
else:
rbst = rr.l + rr.r + 1
map_[head] = Record(lbst,rbst)
return max(lbst+rbst+1,max(ls,rs))
def modifyMap(node,value,map_,s):
if node == None or node not in map_:
return 0
r = map_[node]
if (s and node.value > v) or (s is False and node.value < value):
map_.pop(node)
return r.l + r.r+1
else:
if s:
minus = modifyMap(node.right,value,map_,s)
else:
minus = modifyMap(node.left,value,map_,s)
if s:
r.r = r.r - minus
else:
r.l = r.l - minus
m[n] = r
return minus