python有哪些库函数,python中什么是函数库
主题https://莉特code.com/problems/symmetric-tree/
描述给定的二叉树,判断二叉树是否对称,即树的结构是否镜像对称。
二叉树[1,2,2,3,4,4,3]是镜像对称的,返回True。
1/\22/\/\344二叉树[1,2,2,null,3,null,3]返回False:而不是镜像对称
1/\ 2 2 \ \ 3 3解如果一棵二叉树是镜像对称树,那么左右两个子树是镜像对称的。所以问题可以分解为判断两棵树是否镜像对称。
观察结果表明,二叉树A和B镜像对称时,根节点值相同,左右子树需要满足A和B的镜像对称,A和B的镜像对称,因此,问题会进一步分解。如下图所示。
第一种方法是用递归的思路解决问题。
之前已经总结过,编写递归函数需要明确三个问题:
1.函数的函数。这个函数在做什么?
2.当有多个参数时,递归的结束条件不需要递归。可以直接计算结果,返回。
3.递归过程中,参数不断收缩的形式,以及根据后续递归结果获得当前递归层结果的方法。
针对这三个问题,设计的递归函数的任务就是判断两个二叉树是否镜像对称。递归的结束条件如下。
所有二叉树都是空的(镜像对称,返回真);
只有一棵二叉树是空的(返回False而不是镜像对称);
两个二叉树A和B是否镜像对称可以通过条件句(A.val==B.val) (A.leftsubtree和B.rightsubtree镜像对称))A.rightsubtree和b.leftsubtree判断。
解决方案1 Python实现了# DefinitionForAbinariTreeNode。# ClassTreeNode: # def _ init _ (self,val=0,left=None,right=None(3360 # self . val=val # self . left=left # self . right=right class solution 3360 defis mirror)self,L,r):if(L==None andr==None):returntrue if(L==None or==None):returnfalse return)L . val==r . r . r . left)defissymanam)self,root:treenode(-bool:if root==None:returntrue
空间复杂度为o(log) n),最坏情况下二叉树退化为线性链表。此时二叉树的高度为树中节点的个数n,空间复杂度为o) n)。
另外,在解决问题的公式给出的解中,isSymmetric())函数体如下:
Defissymmetric(self,root:tree node)-bool:return self . is mirror(root),在这种情况下,第一级递归。
解法二第二种方法是利用迭代的思想,逐一判断树中对应的元素是否相等。数据结构使用堆栈或队列。
结合python内部数据结构的特点,可以用List实现堆栈效果:
在列表末尾添加一个元素。append(value):list;
List.pop)):删除列表末尾的元素并返回删除的元素。
把需要比较值的两个节点放入tuple tuple,加上栈,然后一次弹出一个比较。
# definitionforabinarytreenode。# class treenode : # def _ init _ (self,val=0,left=None,right=None ) ) 3300
f . val=val # self . left=left # self . right=right class解法:def isSymmetric(self,root:TreeNode)-bool:if root==None:return True stack=[(root . left,root.right)] while(len(stack)!=0): l,r=stack.pop() if (l==None且r==None): continue if(l==None或r==None):返回False if(l.val!=r.val):返回false stack.append ((l.left,r.right)) stack.append ((l.right,r.left))返回真实的时间复杂度和空间复杂度由于每个节点只被访问一次,所以时间复杂度为O (n),其中n是树中节点的个数。
空间复杂度最好是O(log(n)),最坏是O(n)。
对了,List也可以实现队列的效果,但是效率不高:list.insert(index,obj)。如果index设置为0,则元素将被插入到列表的开头,但每次执行时,列表中的所有元素都需要后移一个位置,时间复杂度为O(n)。
dequee(双端队列,读作“deck”)是集合模块中的dequee结构,可以在两端操作。它具有队列和堆栈的性质,从两个方向添加和删除元素的开销约为O(1)。deque的几种常见使用场景如下:
从集合导入dequed=deque () # deque实现堆栈操作d.append(1) #向堆栈添加一个元素d . append(2)d . append(3)# deque([1,2,3]) x=d.pop () # pop堆栈,x为返回的弹出元素,如果d为空,则触发IndexError deque([1,2])#deque实现队列操作。d appendleft (0) # deque ([0,1,2]) x=d popleft () #来弹出队列,x是返回的弹出元素。如果d为空,则使用trigger IndexError dequee([1,2])#extend从尾部开始依次将所有元素添加到dequee,append是将一个元素添加到dequed.append ([1,2,3])# dequee([1,2, [1,2,3]]d . pop()# dequee([1,2]) d. 6])#extendleft用于将头中的所有元素依次添加到dequee中(可以理解为iterable参数中的元素按逆序添加到dequee双向队列的头中)#extendleft和extendleft的参数都是可迭代类型,Extend(iterable)Extend left(iterable)d . Extend left( ABC )# dequee([ c , b , a ,1,2,4,5,6]) D. rotate (2) # deque ([5,6, c , b , a ,1,2,4])循环向右移动2步:将最后两个元素放在前面。D. rotate (-3) # deque ([b , a ,1,2,4,5,6, c])向左循环移动3步:将前3个元素放在后面。# count d.count(1)# delete元素d.remove (1) # deque ([b , a ,2,4,5,6, c]) remove (value):删除找到的第一个值,如果没有,则抛出ValueError。D.reverse() #返回None,引用d deque的逆序([c ,6,5,4,2, a , b]):
https://docs.python.org/zh-cn/3/library/collections.html?highlight=deque # collections . deque
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。