Leetcode.94 二叉树的中序遍历

该文介绍了如何解决LeetCode上的第94题,即给定一个二叉树,如何进行中序遍历。提供了两种解法,一是使用递归,按照左-根-右的顺序访问节点;二是利用栈模拟递归过程,不断向左遍历并压入栈,然后弹出栈顶节点加入答案并转向右子树。两种方法的时间复杂度均为O(n)。
摘要由CSDN通过智能技术生成

题目链接

Leetcode.94 二叉树的中序遍历 esay

题目描述

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

示例 1:

在这里插入图片描述

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

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:
  • 树中节点数目在范围 [ 0 , 100 ] [0, 100] [0,100]
  • − 100 < = N o d e . v a l < = 100 -100 <= Node.val <= 100 100<=Node.val<=100

解法一:递归

直接 左 中 右 的顺序递归即可。

时间复杂度: O ( n ) O(n) O(n)

C++代码:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;

        function<void(TreeNode*)> dfs = [&](TreeNode* root) ->void{
            if(root == nullptr) return;
            dfs(root->left);
            ans.emplace_back(root->val);
            dfs(root->right);
        };

        dfs(root);

        return ans;
    }
};

解法二:栈模拟

递归的调用过程是一直往左边走,直到左边走不下去了,就将当前节点 r o o t root root 记录到答案 a n s ans ans 中,然后转向右边,然后右边继续这个过程。

我们用栈 s t k stk stk 来模拟这个过程。

时间复杂度: O ( n ) O(n) O(n)

C++代码:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        stack<TreeNode*> stk;

        while(!stk.empty() || root){
            if(root){
                stk.push(root);
                root = root->left;
            }
            else{
                TreeNode* node = stk.top();
                stk.pop();
                ans.emplace_back(node->val);
                root = node->right;
            }
        }

        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值