代码随想录算法训练营第十三天 | 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!

posted @ 2024-06-18 22:26  Y荷兰豆Y  阅读(2)  评论(0编辑  收藏  举报