关于树的遍历算法

作者: 王小鹏的随笔 | 来源:发表于2020-12-11 12:57 被阅读0次

关于树的算法一般有两种,递归(Recursion)和迭代(Iteration),下面我会分别列举几种常见的关于树的例子。

首先介绍一下二叉树的结构(如下图):


image.png

A为根节点(root), D为H,I的父节点(Parent Node), H,I为D的子节点(Child Node), H和I之间互为兄弟节点(Sliblings)。树的深度指的是树中有多少个level,图中,树的深度为4。

我们再来介绍一下树的遍历规则,一般的遍历方式有三种,称为前中后序遍历。


image.png

总结一下,就是前中后指的都是根的位置在前中后。

再具体举一个例子(如图):[1,null,2,3]

image.png

二叉树的结构打印:
TreeNode{val: 1, left: None, right: TreeNode{val: 2, left: TreeNode{val: 3, left: None, right: None}, right: None}}

对于树的代码定义:

# 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

下面看具体的问题:

问题一:二叉树的前序遍历

例题1:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ 144. 二叉树的前序遍历

思路:

思路一: 迭代(Iteration), T:O(n), n为二叉树的节点数; S:O(n), n为栈的开销
思路二: 递归(Recursion),T:O(n), n为二叉树的节点数; S:平均情况下为 O(logn),最坏情况下树呈现链状,为 O(n)。

代码实现:
# 迭代
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        re, stack = [], [root]
        while stack:
            node = stack.pop()
            if node:
                re.append(node.val)
                stack.append(node.right)
                stack.append(node.left)
        return re

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

问题二、求二叉树的最大深度

例题2: https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/ 104. 二叉树的最大深度

思路:

按照总结,常见的思路有两种:递归和迭代。
思路一:递归(Recursion), 时间复杂度为O(n),其中n为树的节点数 , 空间复杂度为O(n),其中n为树的深度。
思路二:迭代(Iteration), 时间复杂度为O(n),其中n为树的节点数 , 空间复杂度为O(n),其中n为树的深度。

代码实现:
# 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 maxDepth(self, root: TreeNode) -> int:
        return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right)) if root else 0

# 迭代:
class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        depth = 0
        stack = [root] if root else []
        while stack:
            depth += 1
            queue = []
            for node in stack:
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            stack = queue
        return depth

撰写记录
2020.12.11-06:11:01-第一次撰写
2020.12.13-08:20:19-第二次撰写

相关文章

  • 关于树的遍历算法

    关于树的算法一般有两种,递归(Recursion)和迭代(Iteration),下面我会分别列举几种常见的关于树的...

  • 剑指offer中关于二叉树题目的总结

    关于二叉树的问题,也就是涉及二叉树的四种遍历算法以及基本的删除、插入等操作 中序遍历和前序遍历/后序遍历的结合 题...

  • DFS(深搜)算法

    深度优先搜索算法(Depth-First-Search):是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的...

  • 二叉树的三种深度优先遍历算法与思路

    看了一些关于二叉树遍历算法的文章,例如:二叉树三种遍历方式的递归和循环实现二叉树的递归与非递归遍历(前序、中序、后...

  • 二叉树的遍历

    关于二叉树的算法问题,一般都以二叉树的遍历为基础,这里给出二叉树的多种遍历方式 树结构: 树结点的定义及其构建: ...

  • ALI 算法

    二叉树遍历算法: 按层遍历, 中序前序后序:

  • 二叉树的遍历

    二叉树的遍历 二叉树常用的遍历方式有:前序遍历、中序遍历、后序遍历、层序遍历四种遍历方式,不同的遍历算法,其思想略...

  • 树的遍历算法

    树的递归遍历 树的层次遍历 树的非递归前序遍历 树的非递归中序遍历

  • 算法-二叉树算法总结

    二叉树算法总结 1 二叉树的遍历 1.1 前序遍历 递归 迭代 1.2 中序遍历 递归 迭代 1.3 后序遍历 递...

  • 二叉树的前序,中序,后序遍历方法总结

    前言 二叉树的前序遍历,中序遍历,后序遍历是面试中常常考察的基本算法,关于它的概念这里不再赘述了,还不了解的同学可...

网友评论

    本文标题:关于树的遍历算法

    本文链接:https://www.haomeiwen.com/subject/lmdjgktx.html