二叉树中序遍历算法详解+实战

举报
Linux猿 发表于 2021/12/09 22:40:44 2021/12/09
【摘要】 CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 欢迎小伙伴们点赞👍、收藏⭐、留言💬

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


一、题目描述

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

约束条件:

树中节点数目在范围 [0, 100] 内

-100 <= Node.val <= 100

二、测试样例

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

输出:[1,3,2]

说明:二叉树如下所示:

先访问节点 1,然后访问节点 3,最后访问节点 2。

三、算法思路

本题主要考查中序遍历算法,但是,本题还需要记录遍历的节点,在遍历的过程中存储即可。中序遍历有两种方法:

(1)递归方法

使用深度优先搜索,中序递归访问,并在访问过程中记录访问的节点。

(2)未递归方法

采用栈存储节点,模拟深度优先搜索,并在访问过程中记录访问的节点。

四、代码实现

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int>ans;
        stack<TreeNode *> s; // 栈,模拟递归
        while (root != NULL || !s.empty()) {
            if (root != NULL) {   //1.遍历左子树
                s.push(root);
                root = root->left;
            } else {
                root = s.top();
                ans.push_back(root->val);
                //2.访问节点
                s.pop();            // 将访问过的节点从栈中删除
                root = root->right; //3.遍历右子树
            }
        }
        return ans;
    }
};
int main()
{
    TreeNode* root = new(TreeNode);
    TreeNode* node2 = new(TreeNode);
    TreeNode* node3 = new(TreeNode);

    root->left = nullptr;
    root->right = node2;
    root->val = 1;

    node2->left = node3;
    node2->right = nullptr;
    node2->val = 2;

    node3->left = nullptr;
    node3->right = nullptr;
    node3->val = 3;

    Solution obj;
    vector<int> ans = obj.inorderTraversal(root);
    for(int i = 0; i < ans.size(); ++i) {
        cout<<ans[i]<<" ";
    }
    cout<<endl;
    return 0;
}

五、复杂度分析

5.1 时间复杂度

时间复杂度:O(n),假设有 n 个节点,中序遍历每一个节点,且每一个节点只访问一次,故时间复杂度为O(n)。

5.2 空间复杂度

空间复杂度:O(n),使用栈来存储节点,栈的深度最大为 n,故空间复杂度为O(n)。

六、题目链接

https://leetcode-cn.com/problems/binary-tree-inorder-traversal/

七、总结

本题主要考查中序遍历算法,需要掌握递归和非递归两种方法。


CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。