leetcode算法94.二叉树的中序遍历

简介: 当给定一个二叉树的根节点 root ,如何返回它的中序遍历?本文带大家解决这个问题。

一、leetcode算法



1、二叉树的中序遍历


1.1、题目


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


示例 1:


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

输出:[1,3,2]

示例 2:


输入:root = []

输出:[]

示例 3:


输入:root = [1]

输出:[1]

示例 4:


输入:root = [1,2]

输出:[2,1]

示例 5:


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

输出:[1,2]


1.2、思路


思路一:此题我们可以使用Morris中序遍历来解决问题,首先有以下规则我们需要熟记于心


假设当前遍历到的节点为 x


1.如果x无左孩子,先将x的值加入答案数组,再访问x的右孩子,即x=x.right;


2.如果x有左孩子,则找到x左子树上最右的节点(即左子树一直向右找到最后一个为止),我们记为predecessor。根据predecessor的右孩子是否为空,进行下面的规则。


3.如果predecessor的右孩子为空,则将其右孩子指向x,然后访问x的左孩子,即x=x.left。


4.如果predecessor的右孩子不为空,则此时其右孩子指向x,说明我们已经遍历完x的左子树,我们将predecessor的右孩子置空,将x的值加入答案数组,然后访问x的右孩子,即x=x.right;


1.3、答案


21.png


class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        TreeNode predecessor = null;
        while(root != null){
            //如果 x 有左孩子,则找到 x 左子树上最右的节点
            if(root.left != null){
                //predecessor节点就是当前root节点向左走一步,然后一直向右走到头
                predecessor = root.left;
                while(predecessor.right != null && predecessor.right != root){
                    predecessor = predecessor.right;
                }
                /**
                这里开始判断predecessor节点的情况如果predecessor 的右孩子为空,则将其右孩子指向 x,然后访问 x 的左孩子, 即 x =x.left      
                 */     
                if(predecessor.right == null){
                    predecessor.right = root;
                    root = root.left;
                }
                /**
                如果 predecessor 的右孩子不为空,则此时其右孩子指向 x,说明我们已经遍历完 x 的左子树,我们将predecessor 的右孩子置空,将 x 的值加入答案数组,然后访问 x 的右孩子,即 x =x.right。
                 */
                 else{
                     res.add(root.val);
                     predecessor.right = null;
                     root = root.right;
                 }
            }
            //如果 x 无左孩子,先将 x 的值加入答案数组,再访问 x 的右孩子,即 x =x.right。
            else{
                res.add(root.val);
                root = root.right;
            }
        }
        return res;
    }
}


复杂度分析


时间复杂度:O(n),其中 n 为二叉搜索树的节点个数。Morris 遍历中每个节点会被访问两次,因此总时间复杂度为 O(2n)=O(n)。


空间复杂度:O(1)。


相关文章
|
2月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
49 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
2月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
2月前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历
|
2月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
39 6
|
2月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
55 2
|
2月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
41 1
|
2月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
40 1
|
3天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
1月前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
1月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
下一篇
无影云桌面