当前位置: 首页 > news >正文

每日一题:LeetCode-589.N叉树的前序遍历

每日一题系列(day 01)

前言:

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

   🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,日日累积,终能成圣🙏🙏!今天就开启我们的斩妖之旅!✈️✈️

LeetCode-589.N叉树的前序遍历:

题目:

给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

示例1:

在这里插入图片描述

示例2:

在这里插入图片描述

注意事项:

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

解法一:

  思路:

  首先开辟一个数组,用来存放N叉树前序遍历的结果,先将根节点压入数组,然后进行范围for(顺序遍历二叉树的每一个节点),将前序遍历的结果放入到tmp数组中,再使用范围for将tmp数组的值拷贝回原数组。最后返回原数组的值即可。

  但是这样写的效率非常低,将ans数组拷贝到tmp数组,再将tmp数组拷贝回原数组,这样来来回回的拷贝效率实在是很低,所以我们可以考虑用封装来优化。

  代码实现:

/*
// 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) {if(root == NULL) return vector<int>{};vector<int> ans;//开辟一个数组用来记录前序遍历结果ans.push_back(root -> val);//将前序遍历到的每个节点的值压入到数组中for(auto x : root -> children)//范围for依次遍历N叉树的每个节点{vector<int> tmp = preorder(x);//用tmp数组接收前序遍历的结果for(auto y : tmp) ans.push_back(y);//拷贝完成之后再将tmp数组元素拷贝回原数组}return ans;//返回前序遍历数组的结果即可}
};

解法二:

  思路:

  以上是不使用封装解决前序遍历问题的方法,没有什么问题是一层封装解决不了的,如果有,那就两层。

  1、我们在preorder函数中定义一个数组ans用来记录前序遍历结果,封装一个前序遍历的函数,将根节点和数组传ans入函数,其中数组传参是用引用传参(避免多一次拷贝)最后返回数组即可。
  2、在函数内部,我们首先将遍历到的每个节点的值压入到数组ans当中,再使用范围for对N叉树的每个子孩子遍历,并且将前序遍历到的节点全部拷贝到ans数组中。

时间复杂度O(N),其中 n 为 N 叉树的节点。每个节点恰好被遍历一次。
空间复杂度O(N),递归过程中需要调用栈的开销,平均情况下为 O(log⁡N),最坏情况下树的深度为 N−1,此时需要的空间复杂度为 O(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 _preorder(Node *root, vector<int> &ans)//引用传参,少一次拷贝构造{if(root == NULL) return;ans.push_back(root -> val);//将前序遍历的节点值压入数组中for(auto x : root -> children)//范围for便利{_preorder(x, ans);//将前序遍历结果也压入到ans数组中}return;}vector<int> preorder(Node* root) {vector<int> ans;//记录前序遍历的结果_preorder(root, ans);//进行前序遍历return ans;//返回前序遍历的数组}
};

  今天第一次写的题也是比较简单的,主要是对数组拷贝的优化,将多次拷贝优化为在一个数组内操作。

http://www.lryc.cn/news/239533.html

相关文章:

  • PTA 7-2 简单计算器
  • 9、鸿蒙应用桌面图标外观和国际化
  • oracle rac 19c修改不同网段public ip
  • 【Django-DRF用法】多年积累md笔记,第(4)篇:Django-DRF反序列化详解
  • OpenAI宣布暂停ChatGPT plus用户订阅,解决方案,无需等待立马升级
  • 如何将 Docsify 项目部署到 CentOS 系统的 Nginx 中
  • 小程序存在优惠卷遍历,但是歪了
  • HarmonyOS第一课-对比Kotlin,快速入门TypeScript
  • 【自动驾驶】一些业内自动驾驶专业术语释义
  • 好用的博客评论系统 Valine 使用及避坑指南
  • 【Mysql】[Err] 1293 - Incorrect table definition;
  • SpringBoot——日志及原理
  • 7种SQL的进阶用法
  • Unity--互动组件(Scrollbar)||Unity--互动组件(DropDown )
  • Unity、UE和Godot的优劣对比
  • CMAK Kafka可视化管理工具
  • PHP如何持续监听Redis的消息订阅并推送到前端?
  • php项目从宝塔面板切换转到phpstudy小皮面板
  • 基于Acconeer的A121-60GHz毫米波雷达传感器SDK移植及测距示例(STM32L496为例)
  • flink1.10袋鼠云 迁移 flink1.15原生环境 事项汇总
  • 鸿蒙:Harmony开发基础知识详解
  • java_函数式接口
  • 解决selenium访问网页中多个iframe,导致无法锁定元素的问题
  • MySQL大表设计
  • 6.基于蜻蜓优化算法 (DA)优化的VMD参数(DA-VMD)
  • OpenCV [c++](图像处理基础示例小程序汇总)
  • 集成多元算法,打造高效字面文本相似度计算与匹配搜索解决方案,助力文本匹配冷启动[BM25、词向量、SimHash、Tfidf、SequenceMatcher]
  • Qt实现图片旋转的几种方式(全)
  • 常见面试题-Redis持久化策略
  • 一文搞懂什么是 GNU/Linux 操作系统