leetcode hot 100

二叉树遍历(迭代)

二叉树的遍历不仅可以用递归来做,也可以用迭代来做。二叉树的递归底层是采用栈来进行的,所以我们迭代就要采用栈来做。

我们知道,栈的原则是先进后出,以前序为例,顺序是中左右,那么,以根节点开始,如果不为空,我们先把根节点压入栈,然后弹出,然后再把右节点压入栈,再把左节点压入栈,之后再按顺序弹出即可。

复制代码
// 前序遍历顺序:中-左-右,入栈顺序:中-右-左
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if (root == null){
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()){
            TreeNode node = stack.pop();
            result.add(node.val);
            if (node.right != null){
                stack.push(node.right);
            }
            if (node.left != null){
                stack.push(node.left);
            }
        }
        return result;
    }
}

与前序做对比的是后续,只需要记住,将前序进栈的顺序倒过来,最后再反转数组即可

复制代码
// 后序遍历顺序 左-右-中 入栈顺序:中-左-右 出栈顺序:中-右-左, 最后翻转结果
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if (root == null){
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()){
            TreeNode node = stack.pop();
            result.add(node.val);
            if (node.left != null){
                stack.push(node.left);
            }
            if (node.right != null){
                stack.push(node.right);
            }
        }
        Collections.reverse(result);
        return result;
    }
}

中序就与前后序不同了,中序过程中,我们的顺序应该是左右中,所以,我们要处理的节点不是我们遍历到的节点,我们可以用一个指针来记录我们遍历到的节点,并使其进栈,之后遍历其左右节点即可

复制代码
// 中序遍历顺序: 左-中-右 入栈顺序: 左-右
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if (root == null){
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.isEmpty()){
           if (cur != null){
               stack.push(cur);
               cur = cur.left;
           }else{
               cur = stack.pop();
               result.add(cur.val);
               cur = cur.right;
           }
        }
        return result;
    }
}
相关推荐
yuanyuan2o22 分钟前
你可能需要的算法思想——动态规划
数据结构·python·算法·动态规划
唯创知音4 分钟前
WTK6900FC鼾声识别芯片:基于DNN-HMM算法的高性能鼾声识别检测处理方案
人工智能·算法·dnn·鼾声识别芯片·鼾声检测芯片
Tisfy6 分钟前
LeetCode 3474.字典序最小的生成字符串:暴力填充
算法·leetcode·字符串·题解
Alicx.7 分钟前
map容器是个好东西
数据结构·算法·蓝桥杯
郝学胜-神的一滴13 分钟前
张量维度操控心法:从reshape到升维降维,吃透PyTorch形状操作的底层逻辑
人工智能·pytorch·python·深度学习·程序人生·算法·机器学习
老虎062715 分钟前
LeetCode热题100 刷题笔记(第五天)多维动态规划(中心扩展法) 「 最长回文子串」
笔记·leetcode·动态规划
白眼黑刺猬22 分钟前
真实面试:大数据开发岗
大数据·面试·职场和发展
果果燕23 分钟前
ARM嵌入式学习(四)--- C语言应用:led、beep、key
linux·运维·算法
Q741_14724 分钟前
每日一题 力扣 2751.机器人碰撞 映射 模拟 栈 C++ 题解
算法·leetcode·模拟··映射
源码之家24 分钟前
计算机毕业设计:基于Python的二手车数据分析可视化系统 Flask框架 可视化 时间序列预测算法 逻辑回归 requests 爬虫 大数据(建议收藏)✅
大数据·hadoop·python·算法·数据分析·flask·课程设计