LeetCode 0094.二叉树的中序遍历:递归/迭代(栈模拟递归)

【LetMeFly】94.二叉树的中序遍历:递归/迭代(栈模拟递归)

力扣题目链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100

 

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

方法一:深度优先搜索DFS(递归)

写一个函数进行深搜:

函数接受一个节点作为参数,若节点为空则直接返回,否则递归左子节点,当前节点加入答案,递归右子节点。

从根节点开始使用上述函数递归,递归完成后返回答案。

  • 时间复杂度 O ( s i z e ( t r e e ) ) O(size(tree)) O(size(tree))
  • 空间复杂度 O ( s i z e ( t r e e ) ) O(size(tree)) O(size(tree))

AC代码

C++
class Solution {
private:
    vector<int> ans;

    void dfs(TreeNode* root) {
        if (!root) {
            return ;
        }
        dfs(root->left);
        ans.push_back(root->val);
        dfs(root->right);
    }
public:
    vector<int> inorderTraversal(TreeNode* root) {
        dfs(root);
        return ans;
    }
};
Python
# from typing import Optional, List

# # Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def dfs(self, root: Optional[TreeNode]) -> None:
        if not root:
            return
        self.dfs(root.left)
        self.ans.append(root.val)
        self.dfs(root.right)

    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        self.ans = []
        self.dfs(root)
        return self.ans

方法二:使用栈模拟递归(栈模拟递归)

递归过程中实际上是系统使用栈帮你存下了当前的信息,调用函数结束后恢复当前信息继续往下执行。因此我们使用栈模拟一下递归即可。

递归的时候都需要保存哪些信息呢?其实我们只需要保存当前节点是什么当前节点是否递归过(左)子节点即可。

若是第一次处理到这个节点,则先将右子入栈,再将本节点再次入栈(并标记一下说左子节点入过栈了),最后将左子节点入栈。(这样出栈顺序将时左中右)

出栈时先看节点是否为空,为空直接返回。若左子节点入栈过了,则将当前节点值加入答案;否则(左子还未入栈),执行“第一次处理到这个节点”的操作。

  • 时间复杂度 O ( s i z e ( t r e e ) ) O(size(tree)) O(size(tree))
  • 空间复杂度 O ( s i z e ( t r e e ) ) O(size(tree)) O(size(tree))

使用栈模拟递归,时空复杂度都不变,但毕竟保存的信息变少了,将会更高效。

AC代码

C++
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        stack<pair<TreeNode*, bool>> st;  // [<node, ifPushedChild>, ...
        st.push({root, false});
        while (st.size()) {
            auto [thisNode, ifPushedChild] = st.top();
            st.pop();
            if (!thisNode) {
                continue;
            }
            if (ifPushedChild) {
                ans.push_back(thisNode->val);
            }
            else {
                st.push({thisNode->right, false});
                st.push({thisNode, true});
                st.push({thisNode->left, false});
            }
        }
        return ans;
    }
};
Python
# from typing import Optional, List

# # Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        ans = []
        st = [(root, False)]
        while st:
            thisNode, ifPushedChild = st.pop()
            if not thisNode:
                continue
            if ifPushedChild:
                ans.append(thisNode.val)
            else:
                st.append((thisNode.right, False))
                st.append((thisNode, True))
                st.append((thisNode.left, False))
        return ans

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/136090242

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/381150.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CVE-2022-0760 漏洞复现

CVE-2022-0760 NSS [HNCTF 2022 WEEK2]ohmywordpress 【CVE-2022-0760】 题目描述&#xff1a;flag在数据库里面。 开题&#xff1a; 顺着按钮一直点下去会发现出现一个按钮叫安装WordPress 安装完之后的界面&#xff0c;有一个搜索框。 F12看看network。 又出现了这个Wor…

C++入门学习(二十五)do-while循环

do { // 代码块&#xff0c;至少会执行一次 } while (条件); 对比一下while和do-while循环&#xff1a; 因为while循环先判断条件&#xff0c;所以数字10直接就没有进入for循环里&#xff0c;卡在了判断条件这一步&#xff0c;所以就没有输出数据&#xff1b; do-while循环是…

亚信安慧AntDB零故障割接方案的实践

亚信安慧AntDB秉持着为客户提供最佳数据库解决方案的理念&#xff0c;不断探索并创新&#xff0c;最近取得了重大的突破。他们成功地研发出一种先进的数据库割接方案&#xff0c;实现了不停服、零故障的数据库割接操作&#xff0c;有效地将替换所带来的业务影响降至最低。 这一…

基于SpringBoot的记账系统项目

点击以下链接获取源码&#xff1a;https://download.csdn.net/download/qq_64505944/88822660?spm1001.2014.3001.5503 Java项目-8 开发工具&#xff1a;IDEA/Eclipse,MySQL,Tomcat 项目框架&#xff1a;SpringBoot,layui 功能&#xff1a;可以按照类型和时间查询&#xff0c…

进程间通信——共享内存

在我的管道博客中曾说过关于进程间通信有很多的方式&#xff0c;管道是利用了Linux 内核原有的接口而创造的&#xff0c;且它只支持单向通信。那么既然有用了原来本来 就有的资源而创造的进程间通信方式&#xff0c;那么也有新创造的通信方式&#xff0c;其中就 有内存共享、消…

UDP是什么,UDP协议及优缺点

UDP&#xff0c;全称 User Datagram Protocol&#xff0c;中文名称为用户数据报协议&#xff0c;主要用来支持那些需要在计算机之间传输数据的网络连接。 UDP 协议从问世至今已经被使用了很多年&#xff0c;虽然目前 UDP 协议的应用不如 TCP 协议广泛&#xff0c;但 UDP 依然是…

飞天使-k8s知识点14-kubernetes散装知识点3-Service与Ingress服务发现控制器

文章目录 Service与Ingress服务发现控制器存储、配置与角色 Service与Ingress服务发现控制器 在 Kubernetes 中&#xff0c;Service 和 Ingress 是两种不同的资源类型&#xff0c;它们都用于处理网络流量&#xff0c;但用途和工作方式有所不同。Service 是 Kubernetes 中的一个…

C++2024寒假J312实战班2.5

题目列表&#xff1a; #1多项式输出 #2龙虎斗 #3表达式求值 #4解密 #1多项式输出 这是第一个题目很简单&#xff0c;我也作对了。 我们下来看一下题目&#xff1a; 我们先来看一下样例&#xff1a; 5 100 -1 1 -3 0 10 首先100是第一项&#xff0c;所以不输出加号&…

4.2 Verilog 过程赋值

关键词&#xff1a;阻塞赋值&#xff0c;非阻塞赋值&#xff0c;并行 过程性赋值是在 initial 或 always 语句块里的赋值&#xff0c;赋值对象是寄存器、整数、实数等类型。 这些变量在被赋值后&#xff0c;其值将保持不变&#xff0c;直到重新被赋予新值。 连续性赋值总是处…

大数据应用对企业的价值

目录 一、大数据应用价值 1.1 大数据技术分析 1.2 原有技术场景的优化 1.2.1 数据分析优化 1.2.2 高并发数据处理 1.3 通过大数据构建新需求 1.3.1 智能推荐 1.3.2 广告系统 1.3.3 产品/流程优化 1.3.4 异常检测 1.3.5 智能管理 1.3.6 人工智能和机器学习 二、大数…

Java写标准输出进度条

学Java这么久了&#xff0c;突发奇想写一个 进度条 玩玩&#xff0c;下面展示一下成功吧&#xff01; Java代码实现如下 public class ProcessBar {public static void main(String[] args) {//进度条StringBuilder processBarnew StringBuilder();//进度条长度int total100;/…

Adb显示第3方应用的包名原理

Android早期版本实现原理请看 Android源码分析-pm命令的实现&#xff0c;列出包名pm list package&#xff0c;列出系统库pm list libraries_pm list packages-CSDN博客 Android12 对adb shell pm 实现原理做了重构&#xff1a;改成了template模式PackageManagerShellCommand …

备战蓝桥杯---动态规划之经典背包问题

看题&#xff1a; 我们令f[i][j]为前i个物品放满容量为j的背包的最大价值。 f[i][j]max(f[i-1][j],f[i-1][j-c[i]]w[i]); 我们开始全副成负无穷。f[0][0]0;最后循环最后一行求max; 负无穷&#xff1a;0xc0c0c0c0;正无穷&#xff1a;0x3f3f3f3f 下面是v12,n6的图示&#xff…

如何开发一个游戏平台?

随着科技的进步和互联网的普及&#xff0c;游戏行业正在迅速发展。游戏平台的开发已成为游戏行业的一个重要组成部分。开发一个游戏平台需要深入了解游戏行业&#xff0c;掌握相关技术&#xff0c;并具备创新思维。以下是一些关于如何开发一个游戏平台的建议&#xff1a; 市场调…

1、学习 Eureka 注册中心

学习 Eureka 注册中心 一、创建 Eureka 微服务0、SpringBoot 和 SpringCloud 版本1、引入 Eureka 服务端依赖2、启动类加 EnableEurekaServer 注解3、配置 yaml 文件&#xff0c;把 Eureka 服务注册到 Eureka 注册中心4、访问 Eureka 服务端&#xff0c;查看注册中心的服务列表…

立体感十足的地图组件,如何设计出来的?

以下是一些设计可视化界面中的地图组件更具备立体感的建议&#xff1a; 使用渐变色&#xff1a; 可以使用不同的渐变色来表现地图的高低差异&#xff0c;例如使用深蓝色或深紫色来表示海底&#xff0c;使用浅绿色或黄色来表示低地&#xff0c;使用橙色或红色来表示高地。 添加…

【linux系统体验】-archlinux折腾日记

archlinux 一、系统安装二、系统配置及美化2.1 中文输入法2.2 安装virtualbox增强工具2.3 终端美化 三、问题总结3.1 一、系统安装 安装步骤人们已经总结了很多很全: Arch Linux图文安装教程 大体步骤&#xff1a; 磁盘分区安装 Linux内核配置系统&#xff08;基本软件&…

Bean 的六种作用域

Bean 的六种作用域 .Bean的作用域属性注入和content获取Bean单例作用域:http://127.0.0.1:8080/single1多例作用域: http://127.0.0.1:8080/prototype请求作用域: http://127.0.0.1:8080/request会话作用域: http://127.0.0.1:8080/sessionApplication作用域: http://127.0.0.1…

python 爬虫篇(3)---->Beautiful Soup 网页解析库的使用(包含实例代码)

Beautiful Soup 网页解析库的使用 文章目录 Beautiful Soup 网页解析库的使用前言一、安装Beautiful Soup 和 lxml二、Beautiful Soup基本使用方法标签选择器1 .string --获取文本内容2 .name --获取标签本身名称3 .attrs[] --通过属性拿属性的值标准选择器find_all( name , at…

2003-2021年地级市实际利用外资数据/地级市实际利用FDI数据

2003-2021年地级市实际利用外商直接投资数据/地级市FDI数据 1、时间&#xff1a;2003-2021年 2、来源&#xff1a;城市年鉴、统计公报、省统计年鉴&#xff0c;已尽最大程度进行填补 3、指标&#xff1a;省份代码、城市代码、省份、城市、年份、当年实际使用外资金额&#x…