几个初始插入序列可以产生相同的二叉搜索树。
例如,四个这样的序列产生相同的树(可以产生这些树的序列总数为 20)
写一下注释,测试如图例子可以通过测试,时间复杂度限制4秒,内存限制256M
第一行数据输入接口可以使用使用li = input().split()接收测试系统任意参数为数列,也可以为其他形式。
数据输出为可以组合产生BST的数量
import random
class BST():
left = None
right = None
data = None
def __init__(self, data):
self.data = data
# 插入操作
def BSTInsert(previous, root, value):
#root代表上一次的节点,previou代表要插入的节点的父母
#遍历到外层时,从19或20行的right或者left为空时,则新申请节点,插入到父母下面
if root is None:
if value > previous.data:#若大于双亲的值,则插入到父母右子树
previous.right = BST(value)
else :#否则,插入父母到左子树上
previous.left = BST(value)
return True
elif value==root.data:#和树中某个节点值相等,插入失败。因为BST要求 左<跟<右
return False
elif value > root.data:#继续深入递归,若value > 当前节点,转向右子树去递归。
#直到root.right或者root.left节点为空,说明走到头了,此时转到11行,执行插入
return BSTInsert(root, root.right, value)
else:
return BSTInsert(root, root.left, value)
#中序遍历
def InOrder(root):
if root is not None:
InOrder(root.left)
print(root.data)
InOrder(root.right)
#先序遍历
def PreOrder(root):
if root is not None:
print(root.data)
InOrder(root.left)
InOrder(root.right)
#后序遍历
def PostOrder(root):
if root is not None:
InOrder(root.left)
InOrder(root.right)
print(root.data)
def BSTSearch(root, value):
if root is None:
return None
while root is not None:
if value > root.data:
root = root.right
elif value < root.data:
root = root.left
else:
return root
return None
#根节点10
root = BST(10)
#插入范围0到500的随机数
for i in range(100):
BSTInsert(None, root, random.randint(0,500))
#中遍历输出结果:从小到大
InOrder(root)
#搜索111的地址
print(BSTSearch(root, 111))
每个序列先排序,然后挨个生成二插搜索树
你学算法就是通过别人代码吗?