目录
102、二叉树的层序遍历
看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大家可以很快刷了十道题。题目链接/文章讲解/视频讲解:代码随想录
思路
深入本质,一通百通。十道二叉树层序遍历题我是一口气全做完的,确实本质都是相通的,直接复制粘贴微调代码就可以了。层序遍历就是用队列,只要队列里不为空就一直while循环。
代码
import collections
from typing import List, Optional
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])
res = []
while queue:
level = []
for i in range(len(queue)):
node = queue.popleft()
level.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(level)
return res
226、翻转二叉树
这道题目 一些做过的同学 理解的也不够深入,建议大家先看我的视频讲解,无论做过没做过,都会有很大收获。
题目链接/文章讲解/视频讲解:代码随想录
思路
哈哈哈,这道题我是凭直觉写的,直接就想着不就每一层左右互换就好了,结果一把就过。(主要是因为不需要考虑先后顺序)
代码
import collections
from typing import Optional
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 root
queue = collections.deque([root])
while queue:
for i 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.对称二叉树
先看视频讲解,会更容易一些。题目链接/文章讲解/视频讲解:代码随想录
思路
差一点就想出来了,大体思路是对的,一开始不知道对空节点怎么进行操作,链接里是if 非节点就在列表里加入None(没错,就是这么简单的问题我也做不对,一看就会,一些就废是我了)。这道题可以用多种数据结构来解,层序遍历,队列或者栈都可以解决。入栈的顺序是重点,其他只要会层序遍历问题不大。
代码
import collections
from typing import Optional
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
# 使用栈
st = []
st.append(root.left)
st.append(root.right)
while st:
rightNode = st.pop()
leftNode = st.pop()
if not leftNode and not rightNode:
return True
if not leftNode or not rightNode or leftNode.val != rightNode.val:
return False
st.append(leftNode.left)
st.append(rightNode.right)
st.append(leftNode.right)
st.append(rightNode.left)
return True
# 层序遍历
# queue = collections.deque([root])
#
# while queue:
# level = []
# for i in range(len(queue)):
# node = queue.popleft()
#
# if node:
# level.append(node.val)
# queue.append(node.left)
# queue.append(node.right)
# else:
# level.append(None)
#
# if level != level[::-1]:
# return False
#
# return True