问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

LeetCode 145:二叉树的后序遍历(迭代法)

创作时间:
作者:
@小白创作中心

LeetCode 145:二叉树的后序遍历(迭代法)

引用
CSDN
1.
https://m.blog.csdn.net/coder_ljw/article/details/144144137

本文将详细讲解LeetCode第145题“二叉树的后序遍历”的解题思路和代码实现。通过对比递归和迭代两种方法,帮助读者更好地理解后序遍历的实现。

题目描述

给你一棵二叉树的根节点 root,返回其节点值的后序遍历。

示例

示例 1:
输入:root = [1,null,2,3]
输出:[3,2,1]
解释:

示例 2:
输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]
输出:[4,6,7,5,2,9,8,3,1]
解释:

示例 3:
输入:root = []
输出:[]

示例 4:
输入:root = [1]
输出:[1]

提示:

  • 树中节点的数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

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

求解思路

栈实现

  1. 创建了一个 ArrayList 用于存储后序遍历的结果。如果根节点为空,直接返回这个空列表。
  2. 接着创建了一个栈 stack,用于模拟递归调用栈,存放待访问的二叉树节点。同时定义了 lastVisited 变量,它的作用是记录上一次访问的节点,以便后续判断当前节点的左右子树是否已经被访问过了。
  3. 将根节点压入栈后,进入循环,只要栈不为空,就执行以下操作,取出栈顶节点(但不立即弹出,通过 peek 方法),然后进行判断:
  • 如果当前栈顶节点满足左子树和右子树都为空,或者它的左右子树节点都是上一次已经访问过的节点(通过和 lastVisited 对比判断),那么说明这个节点可以被访问了,将其值添加到结果列表中,然后弹出栈顶节点,并更新 lastVisited 为当前弹出的这个节点,表示它已经被访问过了。
  • 如果不满足上述可以直接访问的条件,那么按照后序遍历的顺序要求,先处理右子树(如果存在),将右子树节点压入栈;再处理左子树(如果存在),将左子树节点压入栈,以便后续按照正确顺序进行访问。
  1. 有了基本的思路,接下来我们就来通过代码来实现一下。

实现代码

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        if (root == null) {
            return res;
        }
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        TreeNode prev = null;
        while (root != null || !stack.isEmpty()) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            if (root.right == null || root.right == prev) {
                res.add(root.val);
                prev = root;
                root = null;
            } else {
                stack.push(root);
                root = root.right;
            }
        }
        return res;
    }
}

运行结果

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号