【LeetCode算法】第94题:二叉树的中序遍历

目录

一、题目描述

二、初次解答

三、官方解法

四、总结


一、题目描述

二、初次解答

**1. 思路:**二叉树的中序遍历。访问二叉树的左子树,再访问二叉树的根节点,最后访问二叉树的右叉树。

2. 代码:

cpp 复制代码
void order(struct TreeNode* root, int* ret, int* p){
    if(!root)
        return;
    order(root->left, ret, p);
    ret[(*p)++]=root->val;
    order(root->right, ret, p);
}


int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    int* ret=(int*)malloc(sizeof(int)*100);
    *returnSize=0;
    order(root, ret, returnSize);
    return ret;
}

**3. 优点:**实现简单,容易想到,且仅需遍历一遍,时间复杂度为O(n)。

**4. 缺点:**需要递归栈空间,空间复杂度为O(n)。

三、官方解法

**1. 思路:**迭代遍历二叉树,手动维护栈。每次迭代访问子节点前,将当前节点地址保存到栈内,访问完左节点后,再访问当前节点,最后访问右节点。

2. 代码:

cpp 复制代码
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    int* ret=malloc(sizeof(int)*100);
    struct TreeNode** tmp=malloc(sizeof(struct TreeNode*)*100);
    int top=0;
    *returnSize=0;
    while(root || top>0){
        while(root){
            tmp[top++]=root;
            root=root->left;
        }
        root=tmp[--top];
        ret[(*returnSize)++]=root->val;
        root=root->right;
    }
    return ret;
}

**3. 优点:**符合不采用迭代的要求,且时间复杂度为O(n)。

**4. 缺点:**手动维护栈,空间复杂度依旧为O(n)。

四、总结

当遇到二叉树中序遍历时,使用递归实现最简单,也可以采用迭代手动维护栈空间来实现。

相关推荐
登山人在路上7 小时前
Nginx三种会话保持算法对比
算法·哈希算法·散列表
写代码的小球7 小时前
C++计算器(学生版)
c++·算法
AI科技星7 小时前
张祥前统一场论宇宙大统一方程的求导验证
服务器·人工智能·科技·线性代数·算法·生活
序属秋秋秋8 小时前
《Linux系统编程之进程控制》【进程等待】
linux·c语言·c++·进程·系统编程·进程控制·进程等待
Fuly10248 小时前
大模型剪枝(Pruning)技术简介
算法·机器学习·剪枝
Xの哲學8 小时前
Linux网卡注册流程深度解析: 从硬件探测到网络栈
linux·服务器·网络·算法·边缘计算
bubiyoushang8888 小时前
二维地质模型的表面重力值和重力异常计算
算法
仙俊红8 小时前
LeetCode322零钱兑换
算法
颖风船8 小时前
锂电池SOC估计的一种算法(改进无迹卡尔曼滤波)
python·算法·信号处理
551只玄猫9 小时前
KNN算法基础 机器学习基础1 python人工智能
人工智能·python·算法·机器学习·机器学习算法·knn·knn算法