102:层序遍历
二叉树的层序遍历需要借助队列来实现,其中记录每一层级的size至关重要!设置一个size,记录每一个层级的大小。初始大小就是1,这需要提前将第一个root节点放入队列中。在遍历每一个层的每个节点的时候(第二个while)需要将下一层的节点放入队列,每遍历一个数值就要记录这个数字到tmp的一维数组中,然后再把这个节点在队列中及时的pop掉。
def levelOrder(self,root):
res=[]
if not root:
return res
que=deque([root])
while(que):
tmp=[]
size=len(que)
while(size):
cur=que.popleft()
tmp.append(cur.val)
size=size-1
if cur.left:
que.append(cur.left)
if cur.right:
que.append(cur.right)
res.append(tmp)
return res
226:反转二叉树
用递归做,绝绝子!
乐乐用的前序遍历做的:
def invertTree(self,root):
if not root:
return None
root.left,root.right=root.right,root.left
self.invertTree(root.left)
self.invertTree(root.right)
return root
其间有个小插曲,当乐乐这么写赋值就不对了:
root.left=root.right
root.right=root.left
分开写就不对了,真是好奇怪啊!
先不说这个了,反转二叉树是指针的反转,不是数值的反转,如果用数值反转会很麻烦的,而指针反转就会很简单。如图所示,用前序做的话,当前处理的节点是4,也就是我们要反转他的两个左孩子和右孩子(这个不用考虑他有咩有左右孩子,因为没有就是节点None)那就反转成:
然后再遍历他的4的左孩子节点也就是7,反转7所对应的左右孩子,6和9。即:
继续遍历9,发现没有左右孩子,那就return,遍历6,发现也没有左右孩子,就在返回开始遍历右子树2,反转他的左右孩子:
然后在遍历3,7发现都没有左右孩子,那就反转完成了!
101:对称二叉树
判断一棵二叉树是不是对称的,其实就是对比root的左右孩子子树是不是可以反转的。
这里可以分别用两个指针去遍历两个子树,用left指针去遍历左子树,用right指针遍历右子树。
先讨论什么时候直接就返回False了:
(1)left指针指向的节点为空,而right指向的节点不为空。
(2)right指针指向的节点为空,而left指向的节点不为空。
(3)left和right指向的节点都不为空,但是值不相同。
以上三种情况都是返回False的。
那啥时候返回True呢:
(1)left指针指向的节点和right指针指向的节点都为空。
(2)left指针指向的节点和right指针指向的节点不为空,且值还相等。
放入递归中的指针就是让这两个指针指向的节点进行比较,一旦发现False,直接判定不对称。
那么,这种思路就需要收集遍历的信息,只有一直True下去,才能够最后判定是对称的,因此,这种收集信息的遍历,那用后序遍历了。
def isSymmetric(self,root):
def Symmetric(left,right):
if left and not right:
return False
elif left and right and left.val!=right.val:
return False
elif not left and right:
return False
elif not left and not right:
return True
outside=Symmetric(left.left,right.right)
inside=Symmetric(left.right,right.left)
isSame=outside and inside
return isSame
if not root:
return True
return Symmetric(root.left,root.right)
觉得比较难理解的是这里:
outside=Symmetric(left.left,right.right)
inside=Symmetric(left.right,right.left)
isSame=outside and inside
这种写法isSame相当于收集内侧和外侧的必须打成一致的信息,才能够向上返回信息。这个写法,学到了!其实单独看这个代码看不出是后序,但是一看这个代码上来先处理左右孩子的信息,那肯定就是后序的写法,所以,后序遍历不是说最后写处理中间节点信息的就是后序的递归写法!
还有还有,写二叉树的题,一定不要忘记上来先判断root是不是为None!这个必写!