• LeetCode 144. 二叉树的前序遍历


    144. 二叉树的前序遍历

    题目:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
    链接 https://leetcode.cn/problems/binary-tree-preorder-traversal/

    个人思路

    1. 思路1:递归
      自己写法:
    # 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 preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
            ans = []
            if root:
                ans.append(root.val)
                ans.extend(self.preorderTraversal(root.left))
                ans.extend(self.preorderTraversal(root.right))
            return ans
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    官方:
    (1)前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。
    (2)定义 preorder(root) 表示当前遍历到 root 节点的答案。按照定义,我们只要首先将 root 节点的值加入答案,然后递归调用 preorder(root.left) 来遍历 root 节点的左子树,最后递归调用 preorder(root.right) 来遍历 root 节点的右子树即可,递归终止的条件为碰到空节点。

    class Solution:
        def preorderTraversal(self, root: TreeNode) -> List[int]:
            def preorder(root: TreeNode):
                if not root:
                    return
                res.append(root.val)
                preorder(root.left)
                preorder(root.right)
            
            res = list()
            preorder(root)
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    复杂度分析
    时间复杂度:O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次。
    空间复杂度:O(n),为递归过程中栈的开销,平均情况下为 O(logn),最坏情况下树呈现链状,为 O(n)。

    其他思路

    1. 迭代:
    class Solution:
        def preorderTraversal(self, root: TreeNode) -> List[int]:
            res = list()
            if not root:
                return res
            
            stack = []
            node = root
            while stack or node:
                while node:
                    res.append(node.val)
                    stack.append(node)
                    node = node.left
                node = stack.pop()
                node = node.right
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    复杂度分析
    时间复杂度:O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次。
    空间复杂度:O(n),为迭代过程中显式栈的开销,平均情况下为 O(logn),最坏情况下树呈现链状,为 O(n)。

    1. Morris 遍历
      在这里插入图片描述
    class Solution:
        def preorderTraversal(self, root: TreeNode) -> List[int]:
            res = list()
            if not root:
                return res
            
            p1 = root
            while p1:
                p2 = p1.left
                if p2:
                    while p2.right and p2.right != p1:
                        p2 = p2.right
                    if not p2.right:
                        res.append(p1.val)
                        p2.right = p1
                        p1 = p1.left
                        continue
                    else:
                        p2.right = None
                else:
                    res.append(p1.val)
                p1 = p1.right
            
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    作者:LeetCode-Solution
    链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/solution/er-cha-shu-de-qian-xu-bian-li-by-leetcode-solution/

  • 相关阅读:
    工程化面试题
    初次使用IntelliJ IDEA从零开始学习创建maven项目
    查题系统API无限搜题接口搭建
    爬虫,初学者指南
    Linux GCC简明教程(使用GCC编译C语言程序)
    idea生成WebServices接口
    堆友:阿里巴巴文生图工具又出新功能(局部重绘)
    如何组装一个注册中心
    基础中的基础!吴恩达deeplearning.ai:如何搭建一个神经网络
    Vue3全网最细介绍使用
  • 原文地址:https://blog.csdn.net/weixin_48127034/article/details/126111481