代码随想录算法训练营第十三天 | 144.二叉树的前序遍历 102.二叉树的层序遍历
二叉树基本理论
一、种类
1)满二叉树
2)完全二叉树
3)二叉搜索树
4)平衡二叉搜索树:了解各种容器(map\set..)的底层实现?
二、存储方式
1)链式存储:构造用两个指针的链表
2) 顺序存储:下标i的节点,左孩子2i+1,右孩子2i+2,用的少
三、遍历方式
1)深度优先搜索:前序、中序、后序遍历:递归法、迭代法
前序(中左右)、中序(左中右)、后序(左右中):关键看‘中’的位置
2)广度优先搜索:层序遍历:迭代法
四、二叉树定义
点击查看代码
class TreeNode:
def __init__(self, val, left = None, right = None):
self.val = val
self.left = left
self.right = right
144.二叉树的前序遍历(145.后序 94.中序)
题目:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
解题:
思路:递归,相当于图论里的深度优先搜索dfs。
递归算法三元素:1.确定递归函数的参数和返回值;2.确定终止条件;3.确定单层递归的逻辑;
前序:
点击查看代码
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res=[]
def dfs(node):
if node is None:
return
res.append(node.val)
dfs(node.left)
dfs(node.right)
dfs(root)
return res
102.二叉树的层序遍历
题目:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
解题:
思路:借助队列来实现,队列先进先出符合一层层遍历的逻辑。相当于图论中的广度优先搜索。
注:处理每一层时,因为for range已经提前确定的每一层的queue值大小不变,所以遍历当前层时queue.append()不会有影响。
点击查看代码
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if root is None:
return []
queue=deque([root])
res=[]
while queue:
level=[]
for _ in range(len(queue)):
cur=queue.popleft()
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
level.append(cur.val)
res.append(level)
return res
其他层序遍历题有空再刷:
107.二叉树的层次遍历II
199.二叉树的右视图
637.二叉树的层平均值
429.N叉树的层序遍历
515.在每个树行中找最大值
116.填充每个节点的下一个右侧节点指针
117.填充每个节点的下一个右侧节点指针II
104.二叉树的最大深度
111.二叉树的最小深度
心得:
使用if node is None/if not node而不是if node.val == None!