二叉树part02(24.01.10)
安排:先独立做题,然后看视频讲解,然后看文章讲解,然后再重新做一遍题,把题目AC,最后整理成今日当天的博客。
- 学习时长:4h
- 学习内容:自己尝试+pdf说明+视频+力扣题解+自己默写
- 学习感悟:层序遍历一道更比十道强,今天习题量我服了
102.层序遍历
题目链接:力扣题目链接
笔记:
需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。
提交代码:
# 利用长度法
# 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return []
queue = collections.deque([root])
result = []
while queue:
level = [] #每遍历完一层级的节点就清零一次level
for _ in range(len(queue)):
cur = queue.popleft()
level.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
result.append(level)
return result #因为结果要显示逐层的效果,每层放在一个数组里作为外层列表的元素
过程中报错:
1.'NoneType' object has no attribute 'val' ^^^^^^^ level.append(cur.val) 这是因为没有在最开始考虑到二叉树为空的情况。解决方式:在前面添加两行代码:
if not root:
return []
关于一次解决十题:
原代码版本上对结果进行一个倒序重排即可:return result[::-1]
原代码版本上每层只放最右的节点(level的最后一个数):result.append(level[-1])
原代码版本上对每一层级的数组求平均值:
ave = sum(level)/len(level)
result.append(ave)
- (未做) 429.N叉树的层序遍历
这题不太会,感觉就是在最内层两if循环那里变动,但是不太清楚怎么变。
max_ = max(level)
result.append(max_)
注意!返回的是根节点!!这个题好奇怪,我做了半天,贴一下提交通过的代码:
"""
# Definition for a Node.
class Node:
def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
self.val = val
self.left = left
self.right = right
self.next = next
"""
class Solution:
def connect(self, root: 'Optional[Node]') -> 'Optional[Node]':
if not root:
return root
queue = collections.deque([root])
while queue:
level = []
for _ in range(len(queue)):
cur = queue.popleft()
level.append(cur)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
for i in range(len(level)-1):
level[i].next = level[i+1]
return root
chat了一下:level[-1].next = None
,这是不必要的,因为在创建 Node
对象时,next
属性已经被设置为 None
。可以删除。
和上一题一模一样的代码= =
原代码基础上将result初始设为0,实际上是计算level的个数 :
result += 1
return result
这题不会,先跳了。
226.翻转二叉树(没看递归法)
题目链接:力扣题目链接
笔记:
1.遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。
提交代码:
# 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
queue = collections.deque([root])
while queue:
for _ in range(len(queue)):
node = queue.popleft()
node.left, node.right =node.right, node.left
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return root
101.对称二叉树
题目链接:力扣题目链接
笔记:
提交代码:
过程中报错:
(这道题明天看)