二叉树后序遍历_LeetCode 题解 | 145.二叉树的后序遍历

点击上方蓝字设为星标301795305c2e89c4a972d687aa7ba0f0.png

每周一、三、五上午 8:30 准时推送

下面开始今天的学习~

7cec611a17d10ce7b3a0ccd08d5feaec.png

759c0935ab1e9eadfbf7175e809885fb.png

145.二叉树的后序遍历

题目描述

给定一个二叉树,返回它的 后序 遍历。

示例:

输入: [1,null,2,3]     1    \     2    /   3输出: [3,2,1]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

解决方法

如何遍历一棵树

有两种通用的遍历树的策略:

  • 深度优先搜索(DFS)

在这个策略中,我们采用深度作为优先级,以便从跟开始一直到达某个确定的叶子,然后再返回根到达另一个分支。

深度优先搜索策略又可以根据根节点、左孩子和右孩子的相对顺序被细分为先序遍历中序遍历后序遍历

  • 宽度优先搜索(BFS)

我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到。

下图中的顶点按照访问的顺序编号,按照 1-2-3-4-5 的顺序来比较不同的策略。

7ba8c2daff17d4738a7290d1ff1dfb27.png

本问题就是用宽度优先搜索遍历来划分层次:[[1], [2, 3], [4, 5]]

方法 1:迭代

算法

首先,定义树的存储结构 TreeNode

Java

/* Definition for a binary tree node. */public class TreeNode {  int val;  TreeNode left;  TreeNode right;  TreeNode(int x) {    val = x;  }}

Python

class TreeNode(object):    """ Definition of a binary tree node."""    def __init__(self, x):        self.val = x        self.left = None        self.right = None

从根节点开始依次迭代,弹出栈顶元素输出到输出列表中,然后依次压入它的所有孩子节点,按照从上到下、从左至右的顺序依次压入栈中。

因为深度优先搜索后序遍历的顺序是从下到上、从左至右,所以需要将输出列表逆序输出。

Java

class Solution {  public ListpostorderTraversal(TreeNode root) {    LinkedList stack = new LinkedList<>();    LinkedList output = new LinkedList<>();    if (root == null) {      return output;    }    stack.add(root);    while (!stack.isEmpty()) {      TreeNode node = stack.pollLast();      output.addFirst(node.val);      if (node.left != null) {        stack.add(node.left);      }      if (node.right != null) {        stack.add(node.right);      }    }    return output;  }}

Python

class Solution(object):    def postorderTraversal(self, root):        """        :type root: TreeNode        :rtype: List[int]        """        if root is None:            return []        stack, output = [root, ], []        while stack:            root = stack.pop()            output.append(root.val)            if root.left is not None:                stack.append(root.left)            if root.right is not None:                stack.append(root.right)                        return output[::-1]

复杂度分析

  • 时间复杂度:访问每个节点恰好一次,因此时间复杂度为 O(N),其中 N 是节点的个数,也就是树的大小。

  • 空间复杂度:取决于树的结构,最坏情况需要保存整棵树,因此空间复杂度为 O(N)。

4a68143fdd4cad2f2441f66ab3ba0c47.png

本文作者:力扣

编辑&版式:霍霍

声明:本文归 “力扣” 版权所有,如需转载请联系。

435e941d8b2f0b7131ad8492fb9e1ccb.gif

1fa0a84939b20967e7db19da69799c13.png

bd0b1f973d65170be01f0ab7ab75c195.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值