代码随想录算法训练营第n天 |
总结
针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。
二叉树解题的大忌就是自己稀里糊涂的过了(因为这道题相对简单),但是也不知道自己是怎么遍历的。
102 二叉树的层序遍历
题目链接:
自己想
首先层序遍历是广度优先搜索,而二叉树递归遍历则是深度优先搜索
1.用队列实现,如何确定每一层被遍历完了呢?
2.和以前学的知识有没有联系,以前学过用deque做,deque是一个双向队列,利用popleft()时间复杂度为
O
(
n
)
O(n)
O(n)
看完题解
如何确定被遍历完了,很好的解释:
while queue:
for _ range(len(queue)):
result = []
cur = queue.popleft()
result.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
output_.append(result)
完整代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import deque
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return []
queue = deque([root])
output_ = []
while queue:
for _ range(len(queue)):
result = []
cur = queue.popleft()
result.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
output_.append(result)
return output_
226.翻转二叉树
题目链接:
自己想
1.自己按照递归三部曲来进行思考,先是看返回条件,然后看终止条件,然后看一次递归里面包含哪些操作
2.但是自己没有思考自己是用了那一个遍历顺序
看完题解
1.才意识到自己用的是前序遍历的原则
2.同时说到中序遍历会出错->其实我还没有特别透彻的理解二叉树,但是经过这次讲解,我又对二叉树更加深刻了
短一个图,未来补上
完整代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return None
else:
root.left,root.right = root.right,root.left
self.invertTree(root.left)
self.invertTree(root.right)
return root
101. 对称二叉树
题目链接:
自己想
1.用层序遍历即可
2.但是没有解决出现为null的情况,层序遍历会忽略null的情况,没想好有什么解决办法
自己写的错误代码:
# while(queue):
# result = []
# for _ in range(len(queue)):
# cur = queue.popleft()
# result.append(cur.val)
# if cur.left:
# queue.append(cur.left)
# if cur.right:
# queue.append(cur.right)
# a = reversed(result)
# if list(a) != result:
# return False
# return True
看完题解
1.自己的理解是对的,用层序遍历是对的,但是就是方法问题
2.解决问题关键点:把左右孩子分别放入队列中即可,不要按照从左到右的顺序,和以前的思路不一样。
3.在进行运算的时候,加入一些if分支结构的判断这样就可以判断是不是存在null的情况了,解决初始层序遍历时候null值不会被记录的问题
完整代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import deque
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
queue = deque()
queue.append(root.left)
queue.append(root.right)
while(queue):
leftnode = queue.popleft()
rightnode = queue.popleft()
if not leftnode and not rightnode:#不能返回true,这可能只是枝上的某一个节点
continue
elif not leftnode and rightnode or not rightnode and leftnode or leftnode.val != rightnode.val:
return False
queue.append(leftnode.left)
queue.append(rightnode.right)
queue.append(leftnode.right)
queue.append(rightnode.left)
return True
题目链接:
自己想
看完题解
完整代码
在这里插入代码片