算法力扣刷题记录 四十一【N叉树遍历】

news2024/9/8 23:51:33

前言

依然是遍历问题。由二叉树扩展到N叉树遍历。
记录 四十一【N叉树遍历】


一、【589. N叉树的前序遍历】

题目

给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历

n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

示例 1:
在这里插入图片描述

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

示例 2:
在这里插入图片描述

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[1,2,3,6,7,11,14,4,8,12,5,9,13,10]

提示:

节点总数在范围 [0, 104]内
0 <= Node.val <= 10^4
n 叉树的高度小于或等于 1000

进阶:递归法很简单,你可以使用迭代法完成此题吗?

思路1

先用递归法实现。基础肯定是二叉树的前序递归,该如何扩展呢?区别就是child上。

那么N叉树的child递归使用一个for循环。

代码实现1【递归法——N叉树前序遍历】

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    void traversal(Node* cur,vector<int>& record){
        if(cur==nullptr){
            return;
        }
        record.push_back(cur->val);
        for(int i = 0;i < cur->children.size();i++){
            traversal(cur->children[i],record);
        }
    }
    vector<int> preorder(Node* root) {
        vector<int> result;
        traversal(root,result);
        return result;
    }
};

思路2

使用迭代法:基础:二叉树前序迭代。思想类似。用for循环把所有child放进去。

代码实现2【迭代法——N叉树前序遍历】

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    vector<int> preorder(Node* root) {
        vector<int> result;
        stack<Node*> st;
        if(root) st.push(root);
        while(!st.empty()){
            Node* cur = st.top();
            st.pop();
            for(int i = cur->children.size()-1;i >= 0 ;i--){	//child从右向左的放进stack
                if(cur->children[i]) st.push(cur->children[i]);
            }
            result.push_back(cur->val);
        }
        return result;
    }
};

二、【590. N叉树的后序遍历】

题目:和一、题目一样,改成后序遍历。

思路1

递归法。后序遍历:左右中。先for循环所有child,再push_back。改下位置。

代码实现1【递归法——N叉树的后序遍历】

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
void traversal(Node* cur,vector<int>& record){
        if(cur==nullptr){
            return;
        }
        
        for(int i = 0;i < cur->children.size();i++){
            traversal(cur->children[i],record);
        }
        record.push_back(cur->val);	//最后返回的时候加入。
    }
    vector<int> postorder(Node* root) {
        vector<int> result;
        traversal(root,result);
        return result;
    }
};

思路2

迭代法。二叉树后序遍历迭代由前序遍历迭代法改动2处而来。此处同理。

代码实现2【递归法——N叉树的后序遍历】

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    vector<int> postorder(Node* root) {
         vector<int> result;
        stack<Node*> st;
        if(root) st.push(root);
        while(!st.empty()){
            Node* cur = st.top();
            st.pop();
            for(int i = 0;i < cur->children.size();i++){	//child从左向右的放进stack,中右左。
                if(cur->children[i]) st.push(cur->children[i]);
            }
            result.push_back(cur->val);
        }
        reverse(result.begin(),result.end());	//最后reverse。
        return result;
    }
};

总结

N叉树的遍历和二叉树区别在child,用for循环处理所有child,其余同理

(欢迎指正,转载标明出处)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node.js_fs模块

文件删除 文件重命名和移动&#xff08;本质都是修改路径&#xff09; 文件夹操作 创建文件夹(mkdir) 读取文件夹(readdir) &#xff08;打印出来是该文件夹下名称的数组形式&#xff09; 读取当前的文件夹(readdir) 删除文件夹 &#xff08;rmdir&#xff09; 查看资源状态…

合合信息大模型加速器亮相WAIC大会:文档解析与文本识别新突破

合合信息大模型加速器亮相WAIC大会&#xff1a;文档解析与文本识别新突破 文章目录 合合信息大模型加速器亮相WAIC大会&#xff1a;文档解析与文本识别新突破前言合合信息TextIn平台&#xff1a;智能文档处理的领军者文档解析引擎&#xff1a;百页文档秒级处理大模型的发展背景…

文件数据跨境传输这些常见问题,要怎么解决?

越来越多的企业和机构面临文件数据跨境传输的场景和需求&#xff0c;数据跨境流通的过程还是比较复杂的&#xff0c;所以在传输过程中会面临各种问题。 比如法律法规和数据保护、技术标准、网络带宽和速度、数据安全风险控制等&#xff0c;企业要如何解决这些问题呢&#xff1…

数据仓库介绍_维度表(三)

维度表概述 维度表是维度建模的基础和灵魂。前文提到&#xff0c;事实表紧紧围绕业务过程进行设计&#xff0c;而维度表则围绕业务过程所处的环境进行设计。维度表主要包含一个主键和各种维度字段&#xff0c;维度字段称为维度属性。 表设计步骤 确定维度&#xff08;表&…

UI设计工具选择指南:Sketch、XD、Figma、即时设计

在数字产品设计产业链中&#xff0c;UI设计师往往起着连接前后的作用。产品经理从一个“需求”开始&#xff0c;制定一个抽象的产品概念原型。UI设计师通过视觉呈现将抽象概念具体化&#xff0c;完成线框图交互逻辑视觉用户体验&#xff0c;最终输出高保真原型&#xff0c;并将…

2.电容(常见元器件及电路基础知识)

一.电容种类 1.固态电容 这种一般价格贵一些&#xff0c;ESR,ESL比较低,之前项目400W电源用的就是这个&#xff0c;温升能够很好的控制 2.铝电解电容 这种一般很便宜&#xff0c;ESR,ESL相对大一些&#xff0c;一般发热量比较大&#xff0c;烫手。 这种一般比上一个贵一点&am…

this.$confirm不要取消按钮以及右上角的差号

this.$confirm(保存成功! 订单号为&#xff1a;${res.data}, , {confirmButtonText: 确定,showCancelButton: false, // 不显示取消按钮showClose: false, // 不显示右上角的叉号type: success}).then(() > {}) 效果图下&#xff1a;

香港物理服务器租用优势

香港物理服务器租用因其独特的地理位置、先进的网络设施以及优质的服务&#xff0c;成为了众多企业和个人开发者青睐的选择。以下是香港物理服务器租用的主要优势&#xff1a; 稳定性与性能 香港物理服务器直接依赖其高性能硬件运行&#xff0c;不受虚拟化层的影响&#xff0c;…

24小时悬停系留照明无人机技术详解

24小时悬停系留照明无人机是一款专门设计用于提供长时间、高效能照明服务的无人机系统。该系统结合了无人机技术与先进的照明设备&#xff0c;通过系留技术实现无人机的稳定悬停&#xff0c;从而提供连续不断的照明服务。该无人机能够在各种环境条件下进行24小时不间断工作&…

对controller层进行深入学习

目录 1. controller层是干什么的&#xff1f;1.1 controller原理图1.2 controller层为什么要存在&#xff1f;1.2.1 分离关注点1.2.2 响应HTTP请求1.2.3 数据处理与转换1.2.4 错误处理与状态管理1.2.5 流程控制1.2.6 依赖注入与测试 1.3 controller层的优点1.3.1 多端支持1.3.2…

PHP 程序员是学 Swoole ?还是学 Go ?

大家好&#xff0c;我是码农先森。 面临现状 这次为什么要讨论这个话题&#xff0c;因为 Swoole 和 Go 在 PHP 程序员坊间一直都是茶语饭后的谈资&#xff0c;觉得懂 Swoole 和 Go 的就高人一等。相信有很多的 PHP 程序员&#xff0c;自打 Swoole 发布以来就从来没有使用过。…

Z-Fighting 深度冲突权威指南

Z-Fighting 是渲染管道中深度测试中出现的问题。它是由深度值的有限数值精度引起的。故障将表现为不正确的渲染&#xff0c;即屏幕上错误地显示应该被遮挡在另一个后面的对象。故障主要发生在透视投影变换中&#xff0c;但也可能发生在正交投影变换中。到目前为止&#xff0c;一…

GaussDB关键技术原理:高性能(五)

GaussDB关键技术原理&#xff1a;高性能&#xff08;四&#xff09;从USTORE存储引擎、计划缓存计划技术、数据分区与分区剪枝、列式存储和向量化引擎、SMP并行执行等五方面对高性能关键技术进行解读&#xff0c;本篇将从LLVM动态查询编译执行、SQL-BYPASS执行优化、线程池化、…

threeJS 点击模型出现弹框

前言 需要实现点击模型出现弹框展示模型详细信息 实现代码 // 创建3D渲染器 - 初始化时调用 function createCss3DRender(){labelRenderer new CSS3DRenderer();labelRenderer.setSize(window.innerWidth, window.innerHeight);labelRenderer.domElement.style.position &…

如何将本地仓库中的文件推送到远程git服务器

第一步&#xff1a;进入所在项目&#xff0c;右击打开"Git Bash Here" 第二步&#xff1a;git config --global user.email "18351810763163.com" // 输入你的名称 第三步&#xff1a;git config --global user.name "chenliang-sam&quo…

Mongodb单字段索引详解

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第89篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

Github 2024-07-11 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Solidity项目1Python项目1frp: 一个开源的快速反向代理 创建周期:2946 天开发语言:Go协议类型:Apache License 2.0Star数量:75872 …

【文档+源码+调试讲解】冷冻仓储管理系统

摘 要 随着互联网时代的到来&#xff0c;同时计算机网络技术高速发展&#xff0c;网络管理运用也变得越来越广泛。因此&#xff0c;建立一个B/S结构的冷冻仓储管理系统&#xff0c;会使冷冻仓储管理系统工作系统化、规范化&#xff0c;也会提高冷冻仓储管理系统平台形象&#x…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十八章 Linux编写第一个自己的命令

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

有哪些媒体适合邀请来报道我们的活动?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 挑选合适的媒体参加活动发布会时&#xff0c;需要考虑活动的主题、目标受众以及预期效果。建议可以考虑邀请以下几类媒体&#xff1a; 行业媒体&#xff1a;专注于您活动所在行业的媒体&…