二叉树的前序,中序,后序,层序遍历

题目说明

这里是 4 道相关题目:

144.二叉树的前序遍历
94. 二叉树的中序遍历
145. 二叉树的后序遍历
102. 二叉树的层序遍历

二叉树及遍历方式

首先,二叉树是一种数据结构。简单来说,就是一个包含节点,以及它的左右孩子的一种数据结构。
在这里插入图片描述

如果你按照 根节点 -> 左孩子 -> 右孩子 的方式遍历,即「先序遍历」,每次先遍历根节点,遍历结果为 1 2 4 5 3 6 7;

同理,如果你按照 左孩子 -> 根节点 -> 右孩子 的方式遍历,即「中序序遍历」,遍历结果为 4 2 5 1 6 3 7;

如果你按照 左孩子 -> 右孩子 -> 根节点 的方式遍历,即「后序序遍历」,遍历结果为 4 5 2 6 7 3 1;

最后,层次遍历就是按照每一层从左向右的方式进行遍历,遍历结果为 1 2 3 4 5 6 7。

递归解法

前三种遍历的递归解法它们的模板相对比较固定,一般都会新增一个 dfs 函数:

def dfs(root):
    if not root:
        return
    res.append(root.val)
    dfs(root.left)
    dfs(root.right)

对于前序、中序和后序遍历,只需将递归函数里的 res.append(root.val) 放在不同位置即可,然后调用这个递归函数就可以了,代码完全一样。

1.前序遍历:

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        res=[]  
        def dfs(root):
            if not root:
                return
            res.append(root.val)
            dfs(root.left)
            dfs(root.right)
        dfs(root)
        return res

2.中序遍历

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        res=[]  
        def dfs(root):
            if not root:
                return
            dfs(root.left)
            res.append(root.val)
            dfs(root.right)
        dfs(root)
        return res

3.后序遍历

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        res=[]  
        def dfs(root):
            if not root:
                return
            dfs(root.left)
            dfs(root.right)
            res.append(root.val)
        dfs(root)
        return res

4.层序遍历:
前面的都采用了深度优先搜索的方式,而层次遍历使用了广度优先搜索,广度优先搜索主要使用队列实现。

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []  # 特殊情况,root为空直接返回
        from collections import deque
        # 下面就是BFS模板内容,BFS关键在于队列的使用
        layer = deque()
        layer.append(root)  # 压入初始节点
        res = []  # 结果集
        while layer:
            cur_layer = []  # 临时变量,记录当前层的节点
            for _ in range(len(layer)):  # 遍历某一层的节点
                node = layer.popleft()  # 将要处理的节点弹出
                cur_layer.append(node.val)
                if node.left:  # 如果当前节点有左右节点,则压入队列,根据题意注意压入顺序,先左后右,
                    layer.append(node.left)
                if node.right:
                    layer.append(node.right)
            res.append(cur_layer)  # 某一层的节点都处理完之后,将当前层的结果压入结果集
        return res
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页