LeetCode——二叉树的前中后序遍历

二叉树主要有两种遍历方式:

  • 深度优先遍历:先往深走,遇到叶子节点再往回走。
  • 广度优先遍历:一层一层的去遍历,也就是常说的层遍历。

在深度优先遍历中:有三个顺序,前中后序遍历,这中间的"前中后"指的是遍历父节点的先后顺序,且左节点永远在右节点前面遍历。

  • 前序遍历(父左右):F、B、A、D、C、E、G、I、H。

在这里插入图片描述

  • 中序遍历(左父右):A、B、C、D、E、F、G、H、I。

在这里插入图片描述

  • 后序遍历(左右父):A、C、E、D、B、H、I、G、F。

在这里插入图片描述

图片来源:https://zh.m.wikipedia.org/wiki/%E6%A0%91%E7%9A%84%E9%81%8D%E5%8E%86
在树的遍实现方法中,有两种比较主流:迭代和递归。下面以力扣的三道题目作为例子:

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

递归:

# 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]:
        answer = []
        def dfs(node) :
            if node is None :
                return 
            
            answer.append(node.val)
            dfs(node.left)
            dfs(node.right)

        dfs(root)
        return answer
 
 #中序
 class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        answer = []
        def dfs(node) :
            if node is None :
                return 

            dfs(node.left)
            answer.append(node.val)
            dfs(node.right)

        dfs(root)
        return answer

#后序
class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        def dfs(node) :
            if node is None :
                return 
            
            dfs(node.left)
            dfs(node.right)
            answer.append(node.val)

        answer = []
        dfs(root)
        return answer

迭代:

# 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]:
        if root is None :
            return []
        
        stack = []
        result = []

        stack.append(root)
        while stack :
            node = stack.pop()
            result.append(node.val)

            if node.right :
                stack.append(node.right)
            
            if node.left :
                stack.append(node.left)

        return result

#中序
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if root is None :
            return []

        result = []
        stack = []
        curr = root 

        while curr or stack :
            #访问最左边节点
            if curr :
                stack.append(curr)
                curr = curr.left
            
            else :
                node = stack.pop()
                result.append(node.val)
                #访问栈顶元素的右边节点
                curr = node.right
        
        return result

#后序
class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if root is None :
            return []

        result = []
        stack = []
        stack.append(root)

        while stack :
            node = stack.pop()
            result.append(node.val)

            if node.left :
                stack.append(node.left)
            
            if node.right :
                stack.append(node.right)

        return result[ : : -1]
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八岁爱玩耍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值