本文同步发布更新在我的个人主页:http://www.malic.xyz/post-291
问题描述: Cartesian tree,笛卡尔树。从一个各数值均不同的序列建一棵笛卡尔树,这棵树的中序遍历与这个序列一致,同时,笛卡尔树符合一个小顶堆的结构(父结点的值均小于子结点)
给出一个各数值均不同的序列,根据此序列建一棵笛卡尔树,并输出它的层序遍历。
问题分析:给定序列与树的中序遍历一致,并且树是个小顶堆。那么大方向是向右加结点,如果初始有1个笛卡尔树,序列的下一个数字比当前树根的值还小,则这下一个数字就是新的根,原树成为其左子结点。如果下个数字比树根的值大,若右子树为空,则直接插入成右子树,右子树不为空则在右子树上找一个合适的位置插入。由于要求中序必须与原序列一致,所以右子树不空的情况下,新插入的必须在最右,新插入位置原有的树是新插入结点的左子树。构建好了这个树然后对此树进行层序遍历即可
参考程序
class Tree:
def __init__(self,v):
self.value=v
self.lChild=None
self.rChild=None
def transTree(t):
def __tran(t):
if t!=None:
__tran(t.lChild)
print(t.value,end=" ")
__tran(t.rChild)
__tran(t)
print(