左程云,左神的书,笔记

●数组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.(前提是二叉树里面元素取值都不相同)
'''
View Code

思路:还是切分后递归即可.

'''
利用先序数组和中序数组回复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]结果正确
View Code

左神的书,真是性价比最高的.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]))
View Code

●因为是完全二叉树,所以如果这一层还有下一层直接这一层加2的多少次方即可.

所以只需要求树高即可.但是最后一排呢?

●看了这个书,里面图问题基本没有,所以还需要自己来补这些图问题的算法.

 

posted on 2018-06-10 23:25  张博的博客  阅读(748)  评论(0编辑  收藏  举报

导航