●数组list这个大数据不推荐使用.因为会发生扩容操作,这个操作O(N),推荐使用双端队列来做替代.
用2种顺序回复二叉树.
''' 利用先序数组和中序数组回复2查数 ''' class node(): def __init__(self,val): self.left=None self.right=None self.val=val def main(list_pre,list_mid): if list_pre==[]: return None a=list_pre b=list_mid head=node(a[0]) qiefen=b.index(head.val) b1=b[:qiefen] b2=b[qiefen+1:] a1=a[1:qiefen+1] a2=a[qiefen+1:] head.left=main(a1,b1) head.right=main(a2,b2) return head print(main([1,2,4,5,8,9,3,6,7],[4,2,8,5,9,1,6,3,7]).val) head=main([1,2,4,5,8,9,3,6,7],[4,2,8,5,9,1,6,3,7]) ''' 按层打印 ''' print('下面按层便利输出,看结果对不对') a=[head] print(a[0].val) while set(a)!=set([None]): b=[] for i in a: if i!=None: b.append(i.left) b.append(i.right) c=[] for j in b: if j!=None: c.append(j.val) else: c.append(None) print(c) a=b#经验证对了. ''' 中序和后序.反向切割即可. ''' ''' 先序和后序结合重构二叉树. 如果加入条件节点值都不同的二叉树,也大多情况下无法重构出来. 比如:头结点是1,左孩子是2,有孩子是null 头结点是1 做儿子是null 右二子是2 他们的数组都是一样的. #只有每个节点的孩子数都是0或者2的2茶树才能被先序和后序重构出来. 通过找坐标做分割即可. 思路:头,左,右 左,右,头 分别是两种便利. 那么如何找到左和右的切分坐标? 只需要找到第一排左里面第一个元素,找到他在第二排里面的位置就是.第二排左的最后一个位置了. 因为他是做的head.(前提是二叉树里面元素取值都不相同) '''