二叉树和N叉数的遍历合集

news2024/11/28 18:44:09

二叉树和N叉数的遍历合集

二叉树的前序遍历

前序遍历的顺序是 根 -> 左儿子 -> 右儿子,所以我们直接按照这个顺序 dfs 就行

dfs

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        function<void(TreeNode*)> dfs = [&](TreeNode* u) -> void {
            if (!u) return;
            res.emplace_back(u->val);
            dfs(u->left);
            dfs(u->right);
        };
        dfs(root);
        return res;
    }
};

时间复杂度 : O ( n ) O(n) O(n) (每个节点至多被遍历一次)

二叉树的中序遍历

中序遍历的顺序是 左儿子 -> 根 -> 右儿子,所以我们直接按照这个顺序 dfs 就行

dfs

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        function<void(TreeNode*)> dfs = [&](TreeNode* u) -> void {
            if (!u) return;
            dfs(u->left); // 左
            res.push_back(u->val); // 根
            dfs(u->right); // 右
        };
        dfs(root);
        return res;
    }
};

时间复杂度 : O ( n ) O(n) O(n) (每个节点至多被遍历一次)

迭代法

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        if (!root) return {};
        vector<int> res;
        stack<TreeNode*> stk;
        stk.push(root);
        unordered_map<TreeNode*, bool> st;
        TreeNode* t = nullptr;
        while (stk.size()) {
            t = stk.top();
            while (!st[t->left] && t->left) {
                stk.push(t->left);
                t = t->left;
            }
            res.push_back(t->val);
            st[t] = true;
            stk.pop();
            if (!st[t->right] && t->right) {
                stk.push(t->right);
                t = t->right;
            }
        }
        return res;
    }
};

时间复杂度 : O ( n ) O(n) O(n) (每个节点至多被遍历一次)

二叉树的后序遍历

后序遍历的顺序是 左儿子 -> 右儿子 -> 根,所以我们直接按照这个顺序 dfs 就行

dfs

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        function<void(TreeNode*)> dfs = [&](TreeNode* u) -> void {
            if (!u) return;
            dfs(u->left);
            dfs(u->right);
            res.push_back(u->val);
        };
        dfs(root);
        return res;
    }
};

时间复杂度 : O ( n ) O(n) O(n) (每个节点至多被遍历一次)

二叉树的层序遍历

层序遍历就是一层一层遍历,我们只需要用一个数组存一下每一层的所有节点,每次遍历更新为该层节点的所有子节点就行,本质是 bfs

bfs

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        if (!root) return {};
        vector<TreeNode*> q{root};
        vector<vector<int>> res;
        while (q.size()) {
            vector<TreeNode*> p;
            vector<int> t;
            for (auto& x : q) {
                t.push_back(x->val);
                for (auto& node : {x->left, x->right}) {
                    if (node) {
                        p.push_back(node);
                    }
                }
            }
            res.push_back(t);
            q = move(p);
        }
        return res;
    }
};

时间复杂度 : O ( n ) O(n) O(n) (每个节点至多被遍历一次)

二叉树的垂序遍历

给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。

对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row + 1, col - 1)(row + 1, col + 1) 。树的根结点位于 (0, 0)

二叉树的 垂序遍历 从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。如果同行同列上有多个结点,则按结点的值从小到大进行排序。

返回二叉树的 垂序遍历 序列。

提示:

  • 树中结点数目总数在范围 [1, 1000]
  • 0 <= Node.val <= 1000

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:[[9],[3,15],[20],[7]]
解释:
列 -1 :只有结点 9 在此列中。
列  0 :只有结点 3 和 15 在此列中,按从上到下顺序。
列  1 :只有结点 20 在此列中。
列  2 :只有结点 7 在此列中。

根据题目的意思,我们只需要将所有的信息存下来,最后排序即可,然后将所有的数据分组,返回答案即可,我们要记录3个数据,每个节点的{深度, 编号, 值},因为超过了两个数据,我们不能用pair<int, int>,我们可以使用元组,tuple<int, int, int>,最后分组一下即可

dfs

class Solution {
public:
    using TIII = tuple<int, int, int>;
    vector<vector<int>> verticalTraversal(TreeNode* root) {
        vector<TIII> pos;
        function<void(TreeNode*, int, int)> dfs = [&](TreeNode* u, int dep, int id) -> void {
            pos.push_back({id, dep, u->val});
            if (u->left) dfs(u->left, dep + 1, id - 1);
            if (u->right) dfs(u->right, dep + 1, id + 1);
        };
        dfs(root, 0, 0);
        
        sort(pos.begin(), pos.end(), [&](TIII& a, TIII& b) {
            if (get<0>(a) != get<0>(b)) return get<0>(a) < get<0>(b);
            else if (get<1>(a) != get<1>(b)) return get<1>(a) < get<1>(b);
            return get<2>(a) < get<2>(b);
        });
        vector<vector<int>> res;
        for (int i = 0; i < pos.size(); ) {
            vector<int> t;
            int j = get<0>(pos[i]), k = i;
            // 分组
            while (k < pos.size() && get<0>(pos[k]) == j) {
                t.push_back(get<2>(pos[k ++]));
            }
            res.push_back(t);
            i = k;
        }
        return res;
    }
};

时间复杂度 : O ( n ) O(n) O(n)

N叉树的前序遍历

和二叉树的前序遍历思路一样的,稍微改一改就行

dfs

class Solution {
public:
    vector<int> preorder(Node* root) {
        vector<int> res;
        function<void(Node*)> dfs = [&](Node* u) -> void {
            if (!u) return;
            res.emplace_back(u->val);
            for (auto& x : u->children) {
                dfs(x);
            }
        };
        dfs(root);
        return res;
    }
};

时间复杂度: O ( n ) O(n) O(n) (每个节点之被遍历一次)

N叉树的后序遍历

class Solution {
public:
    vector<int> postorder(Node* root) {
        vector<int> res;
        function<void(Node*)> dfs = [&](Node* u) -> void {
            if (!u) return;
            for (auto& x : u->children) {
                dfs(x);
            }
            res.emplace_back(u->val);
        };
        dfs(root);
        return res;
    }
};

时间复杂度: O ( n ) O(n) O(n) (每个节点之被遍历一次)

N叉树的层序遍历

同二叉树

dfs

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        if (!root) return {};
        vector<Node*> q{root};
        vector<vector<int>> res;
        while (q.size()) {
            vector<Node*> p;
            vector<int> t;
            for (auto& x : q) {
                t.push_back(x->val);
                for (auto& node : x->children) {
                    p.push_back(node);
                }
            }
            res.push_back(t);
            q = move(p);
        }
        return res;
    }
};

时间复杂度: O ( n ) O(n) O(n) (每个节点之被遍历一次)

结束了

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

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

相关文章

如何在极低成本硬件上落地人工智能算法 —— 分布式AI

一、背景 分布式AI的发展前景非常广阔&#xff0c;随着5G、6G等高速网络通信技术的普及和边缘计算能力的提升&#xff0c;以及AI算法和硬件的不断优化进步&#xff0c;分布式AI将在多个领域展现出强大的应用潜力和市场价值&#xff1a; 1. **物联网&#xff08;IoT&#xff0…

unity学习(20)——客户端与服务器合力完成注册功能(2)调试注册逻辑

接着上一节的问题&#xff0c;想办法升级成具备数据库功能的服务器&#xff0c;这个是必须的。 至少在初始化要学会把文件转换为session&#xff0c;新知识&#xff0c;有挑战的。 现在是从LoginHandler.cs跳到了AccountBiz.cs的create&#xff0c;跳度还是很大的。 create函…

宝塔安装MySQL、设置MySQL密码、设置navicat连接

1、登录宝塔面板进行安装 2、设置MySQL连接密码 3、安装好了设置navicat连接 登录MySQL [roothecs-394544 ~]# mysql -uroot -p Enter password: 切换到MySQL数据 mysql> use mysql Database changed mysql> 查询用户信息 mysql> select host,user from user; ---…

一起玩儿物联网人工智能小车(ESP32)——63 SD和TF卡模块的使用

摘要&#xff1a;本文介绍SD和TF卡模块的使用方法 前面介绍了非易失性存储的使用方法&#xff0c;由于空间和本身只支持键值对的限制&#xff0c;非易失性存储只适用于少量数据的记录。而不适用于各种声音、图片、大量数据等情况的使用。这时候就需要有文件系统或者更大容量存…

无人机数据链技术,无人机数据链路系统技术详解,无人机数传技术

早期的无人机更多的为军事应用服务&#xff0c;如军事任务侦查等&#xff0c;随着技术和社会的发展&#xff0c;工业级无人机和民用无人机得到快速的发展&#xff0c;工业级无人机用于农业植保、地理测绘、电力巡检、救灾援助等&#xff1b;民用无人机用于航拍、物流等等领域。…

Unity之闪电侠大战蓝毒兽

目录 &#x1f3a8;一、创建地形 &#x1f3ae;二、创建角色 &#x1f3c3;2.1 动画 &#x1f3c3;2.2 拖尾 &#x1f3c3;2.3 角色控制 ​&#x1f3c3;2.4 技能释放 &#x1f3c3;2.5 准星 &#x1f4f1;三、创建敌人 &#x1f432;3.1 选择模型 &#x1f432;3.…

GitLab安装配置

一、GitLab的简介 GitLab是开源的代码托管平台&#xff0c;提供版本控制功能、代码审查、持续集成等工具&#xff0c;帮助团队协作开发软件项目。用户可以创建仓库存储代码&#xff0c;管理问题追踪&#xff0c;部署自动化流程等。 二、GitLab的安装 1、Rocky_Linux 下载安装 …

使用RK3588开发板使用 SFTP 互传-windows与开发板互传

MobaXterm 软件网盘下载路径&#xff1a;“iTOP-3588 开发板\02_【iTOP-RK3588 开发板】开发资料\04_iTOP-3588 开发板所需 PC 软件&#xff08;工具&#xff09;\02-MobaXterm”。 打开 MobaXterm 创建一个 SFTP 会话&#xff0c;如下图所示&#xff1a; 输入密码 topeet 进入…

《UE5_C++多人TPS完整教程》学习笔记19 ——《P20 我们子系统的回调函数(Callbacks to Our Subsystem)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P20 我们子系统的回调函数&#xff08;Callbacks to Our Subsystem&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&…

外汇天眼:小白开始实盘之前,必须知道的7件事

在进行外汇交易时&#xff0c;保持松弛的心态和学习外汇知识是一件很重要的事情&#xff0c;但对于缺乏交易经验的交易小白来说&#xff0c;想保持松弛的心态和学习外汇知识比较困难&#xff0c;考虑到这一点&#xff0c;天眼给大家总结了7件在交易前必须知道的事情。 1、实现财…

基于PSO优化的GRU多输入分类(Matlab)粒子群优化门控循环单元神经网络分类预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整代码数据分享下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台…

167基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的程序

基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的程序&#xff0c;可显示承载能力、压强、刚度及温升等图谱.程序已调通&#xff0c;可直接运行。 167 显示承载能力、压强、刚度及温升 (xiaohongshu.com)https://www.xiaohongshu.com/explore/65d212b200000000…

element 表单提交图片(表单上传图片)

文章目录 使用场景页面效果前端代码 使用场景 vue2 element 表单提交图片   1.点击【上传图片】按钮择本地图片&#xff08;只能选择一张图片&#xff09;后。   2.点击图片&#xff0c;支持放大查看。   3.点击【保存】按钮&#xff0c;提交表单。 页面效果 前端代码…

新版本HC物联网系统

代码开源在 HC物联网平台: HC物联网系统用于小区&#xff0c;园区等设备管理&#xff0c;包括门禁&#xff0c;道闸&#xff0c;监控&#xff0c;充电桩&#xff0c;智能水电表&#xff0c;梯控和门锁等设备 HC 物联网系统 HC物联网系统专注于小区和园区内的设备管理&#xf…

辽宁博学优晨教育:视频剪辑培训新篇章,开启你的创意之旅

在数字化时代&#xff0c;视频剪辑已成为一项炙手可热的技能。辽宁博学优晨教育深知市场需求&#xff0c;特别推出视频剪辑培训专业&#xff0c;为广大爱好者和专业人士提供了一个学习和交流的平台。在这里&#xff0c;我们不仅传授技术&#xff0c;更致力于激发你的创意潜能&a…

Unity ScreenPointToRay 获取到的坐标不准确

&#x1f47e;奇奇怪怪的 &#x1f959;问题描述&#x1f96a;解决方案&#x1f37f;验证代码 &#x1f959;问题描述 使用&#xff1a;Camera.main.ScreenPointToRay 将鼠标坐标转换成射线&#xff0c;然后通过&#xff1a;Physics.Raycast 获取到射线碰撞到的坐标&#xff0…

单反sd卡照片突然没有了?原因+解决方案

在使用单反相机拍摄时&#xff0c;SD卡作为存储媒介&#xff0c;承担着存储照片的重要角色。然而&#xff0c;有时候我们会遇到SD卡中的照片突然消失的情况&#xff0c;给拍摄工作带来很大的困扰。本文将深入剖析导致这一问题的原因&#xff0c;并提供相应的解决方案&#xff0…

SMART信息——你的固态硬盘实时体检报告

SMART&#xff0c;或者严谨地说&#xff1a;S.M.A.R.T (Self-Monitoring Analysis and Reporting Technology)&#xff0c;即“自我监测分析与报告技术”&#xff0c;在硬盘行业耳熟能详。无论是传统的机械硬盘&#xff0c;还是作为后起之秀的固态硬盘&#xff0c;它们都在使用…

C++面试宝典第28题:寻找丢失的数字

题目 给定一个包含n个整数的数组nums,其中nums[i]在区间[1, n]内。请找出所有在[1, n]范围内,但没有出现在nums中的数字,并以数组的形式返回结果。 示例1: 输入:nums = [4, 3, 2, 7, 8, 2, 3, 1] 输出:[5, 6] 示例2: 输入:nums = [1, 1] 输出:[2] 解析 初看这道题,…

【WEB环境】-LNTMP或LAMP结构搭建(记录)

一、手工安装搭建 1.1 LNTMP 【nginx:rpm安装】 安装根目录路径&#xff1a;/usr/local/nginx 启动&#xff1a;/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 停止kill -QUIT 2072 ./nginx -s stop /usr/local/nginx/sbin/nginx -s stop 重启…