从小白开始刷算法 Tree 树篇 中序遍历 leetcode.94

简介: 从小白开始刷算法 Tree 树篇 中序遍历 leetcode.94

94.二叉树的中序遍历


给定一个二叉树的根节点 root ,返回 它的 中序 遍历


示例1:


1


\


2


/


3


输入:root = [1,null,2,3]

输出:[1,3,2]


示例 2:


输入:root = []

输出:[]


示例 3:


输入:root = [1]

输出:[1]


题目来源:力扣(LeetCode)


迭代思路


能否写出:不能写出,需要参考思路

时间:40分钟

思路:使用了一个栈来辅助遍历。首先将当前节点及其左子节点依次入栈,直到当前节点为空。然后从栈中弹出一个节点,将其值加入结果列表,然后将当前节点指向弹出节点的右子节点,继续下一轮遍历。重复这个过程,直到栈为空且当前节点为空,遍历结束。返回结果列表即为中序遍历结果。

// 仅是我的思路代码,leetcode上大神更厉害
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        ArrayList<Integer> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode temp = root;
        while (temp != null || !stack.isEmpty()) {
            while (temp != null) {
                stack.push(temp);
                temp = temp.left;
            }
            TreeNode node = stack.pop();
            result.add(node.val);
            temp = node.right;
        }
        return result;
    }
}

时间复杂度:O(n)

空间复杂度:O(n)


中序遍历迭代与先序遍历迭代 逻辑顺序


中序遍历的迭代实现与先序遍历的迭代实现在遍历顺序上有所不同。


在中序遍历迭代实现中,首先将当前节点及其左子节点依次入栈,直到当前节点为空。然后从栈中弹出一个节点,将其值加入结果列表,并将当前节点指向弹出节点的右子节点,继续下一轮遍历。这样可以保证在遍历过程中按照左根右的顺序访问节点,即先访问左子树,再访问根节点,最后访问右子树。


而在先序遍历迭代实现中,首先将根节点入栈,然后进入循环,从栈中弹出一个节点,将其值加入结果列表,然后依次将右子节点和左子节点入栈。这样可以保证在遍历过程中按照根左右的顺序访问节点,即先访问根节点,再访问左子树,最后访问右子树。


因此,中序遍历迭代实现和先序遍历迭代实现的栈操作顺序略有不同,导致遍历顺序也不同。


其他思路


递归:


class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        inorder(root, res);
        return res;
    }
    public void inorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        inorder(root.left, res); // 递归遍历左子树
        res.add(root.val); // 访问当前节点
        inorder(root.right, res); // 递归遍历右子树
    }
}

时间复杂度:O(n)

空间复杂度:O(n)

Morris 中序遍历

相关文章
|
5月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
287 4
|
5月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
10月前
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
8月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
210 2
|
10月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
254 17
|
10月前
|
存储 监控 算法
局域网上网记录监控的 C# 基数树算法高效检索方案研究
在企业网络管理与信息安全领域,局域网上网记录监控是维护网络安全、规范网络行为的关键举措。随着企业网络数据量呈指数级增长,如何高效存储和检索上网记录数据成为亟待解决的核心问题。基数树(Trie 树)作为一种独特的数据结构,凭借其在字符串处理方面的卓越性能,为局域网上网记录监控提供了创新的解决方案。本文将深入剖析基数树算法的原理,并通过 C# 语言实现的代码示例,阐述其在局域网上网记录监控场景中的具体应用。
217 7
|
9月前
|
机器学习/深度学习 算法 搜索推荐
决策树算法如何读懂你的购物心理?一文看懂背后的科学
"你为什么总能收到刚好符合需求的商品推荐?你有没有好奇过,为什么刚浏览过的商品就出现了折扣通知?
264 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
363 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
209 6
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
457 2

热门文章

最新文章