【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)。

四、总结

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

相关推荐
RickyWasYoung几秒前
【聚类算法】高维数据的聚类
算法·数据挖掘·聚类
古月居GYH6 分钟前
数据结构算法——排序算法解析
数据结构·算法·排序算法
Zzzzmo_14 分钟前
【Java】排序算法(思路及图解)
算法·排序算法
无限进步_14 分钟前
C语言文件操作函数解析
c语言·开发语言·数据库·c++·后端·visual studio
人得思变~谁会嫌自己帅呢?16 分钟前
希尔排序算法
数据结构·算法·排序算法
福尔摩斯张21 分钟前
C语言文件操作详解(一):文件的打开与关闭(详细)
java·linux·运维·服务器·c语言·数据结构·算法
white-persist22 分钟前
【攻防世界】reverse | answer_to_everything 详细题解 WP
c语言·开发语言·汇编·python·算法·网络安全·everything
vortex523 分钟前
反弹Shell场景中bash -c与直接bash -i的适用差异解析
c语言·chrome·bash
Ynchen. ~30 分钟前
[工程实战] 攻克“数据孤岛”:基于隐语纵向联邦学习的金融风控建模全解析
算法·金融·逻辑回归·隐语
程序员-King.33 分钟前
day107—同向双指针—无重复字符的最长字串(LeetCode-3)
算法·leetcode·双指针