●数组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.(前提是二叉树里面元素取值都不相同)
'''
思路:还是切分后递归即可.
'''
利用先序数组和中序数组回复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.(前提是二叉树里面元素取值都不相同)
'''
'''
利用先序和中序来建立后序数组
'''
def main(first,mid):
if first==[]:
return []
tou_index = mid.index(first[0])
zuo1=first[1:tou_index+1]
you1=first[tou_index+1:]
zuo2=mid[:tou_index]
you2=mid[tou_index+1:]
return main(zuo1,zuo2)+main(you1,you2)+[first[0]]
print(main([1,2,4,5,8,9,3,6,7],[4,2,8,5,9,1,6,3,7]))#[4, 8, 9, 5, 2, 6, 7, 3, 1]结果正确
左神的书,真是性价比最高的.leetcode大量类型重复的题目.刷了也没啥意思.左神的书,题目都很典型.
●看哪个是head即可.然后分割,递归.
'''
因为中序遍历是升序,并且无重复,所以是二叉搜索数
'''
def main(list_mid):
a=list_mid
if a==[]:
return 1
if len(a)==1:
return 1
ans=0
for i in range(len(a)):
head=a[i]
left=a[:i]
right=a[i+1:]
ans+=main(left)*main(right)
return ans
print(main([1,2,3,4,5]))
●因为是完全二叉树,所以如果这一层还有下一层直接这一层加2的多少次方即可.
所以只需要求树高即可.但是最后一排呢?
●看了这个书,里面图问题基本没有,所以还需要自己来补这些图问题的算法.