左程云,左神的书,笔记
●数组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的多少次方即可.
所以只需要求树高即可.但是最后一排呢?
●看了这个书,里面图问题基本没有,所以还需要自己来补这些图问题的算法.