zoukankan      html  css  js  c++  java
  • 左程云,左神的书,笔记

    ●数组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的多少次方即可.

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

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

  • 相关阅读:
    ASP.NET Core 基于JWT的认证(二)
    ASP.NET Core 基于JWT的认证(一)
    C#数据Encrypt加密Encrypt解密的算法使用--非对称算法RSACryptoServiceProvider
    C#数据Encrypt加密Encrypt解密的算法使用
    C# 实现winform自动悬浮
    测试winform自动悬浮
    C#实现图像拖拽以及锚点缩放功能
    C# Microsoft.Office.Interop.Owc11 导出excel文件
    Docker修改daemon.json后无法启动的问题
    Kubernetes命名空间
  • 原文地址:https://www.cnblogs.com/zhangbo2008/p/9165020.html
Copyright © 2011-2022 走看看