二叉树的层序遍历问题

二叉树的层序遍历中的几个问题(C语言) 二叉树的层序遍历中的几个问题(C语言) 在使用C语言实现二叉树的层序过程中,从队列的建立、二叉树的建立、层序遍历几个环节中遇到了几个问题,现记录一下这些问题。 1、队列的建立 队列初始化:InitQueue 在队尾加入元素:Push 删除队头元素:Pop 队列初始化的时候是开辟一个next域为NULL的队列指针,注意应该使得队列的头等于队列的尾,这样在队列增加和删除元素的时候队... 阅读详情

leetcode662. 二叉树最大宽度

https://leetcode-cn.com/problems/maximum-width-of-binary-tree/

因为二叉树的结构与满二叉树相同,因此可以用满二叉树的编号方式给二叉树中所有结点编号,当然要通过二叉树的层序遍历来实现。如果一个结点编号为i,那么其左孩子编号就是 2 * i,其右孩子就编号成2 * i + 1。比较重要的是为了防止编号越来越大而超过int的表示范围,可以在给每一层编号的时候减去一个统一的偏移量offset需要在for循环外边定义。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) {
        if(!root) return 0;
        root->val = 0; // 根节点编号0
        queue<TreeNode *> q;
        q.push(root);
        int ans = 0;

        while(!q.empty()){
            int len = q.size();
            ans = max(ans, q.back()->val - q.front()->val + 1);
            int offset = q.front()->val; // 根节点编号作为所有孩子结点编号的偏移
            for(int i = 0; i < len; ++i){
                TreeNode *node = q.front();
                q.pop();
                node->val -= offset;
                if(node->left){
                    node->left->val = node->val * 2;
                    q.push(node->left);
                } 
                if(node->right){
                    node->right->val = node->val * 2 + 1;
                    q.push(node->right);
                } 
            }
        }

        return ans;

    }
};

此类型题目的基础是二叉树的层序遍历。一般都是用一个辅助队列来实现层序遍历。

https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

while循环中len用来确定下一层有多少个结点。而for循环中每一轮的node都是同一层的结点。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        if(!root) return ans;
        vector<int> temp;
        queue<TreeNode *> q;
        q.push(root);

        while(!q.empty()){
            int len = q.size();
            for(int i = 0; i < len; ++i){
                TreeNode *node = q.front();
                q.pop();
                temp.push_back(node->val);
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);

            }
            ans.push_back(temp);
            temp.clear();
        }
        return ans;

    }
};

同理N叉树的层序遍历

https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/submissions/

/*
// 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<vector<int>> levelOrder(Node* root) {
        vector<vector<int>> ans;
        vector<int> temp;
        if(!root) return ans;
        queue<Node *> q;
        q.push(root);

        while(!q.empty()){
            int len = q.size();
            for(int i = 0; i < len; ++i){
                Node *node = q.front();
                q.pop();
                temp.push_back(node->val);
                for(auto &child : node->children){
                    q.push(child);
                }
            }
            ans.push_back(temp);
            temp.clear();
        }
        return ans;
        
    }
};

二叉树的锯齿形层序遍历

https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/

首先,下边这种解法是错误的。。。

比如这个例子:

我们想要的是第一层 1, 第二层 3,2,第三层4 5,但是下边这种方法第三层的时候先出队的结点时3,所以遍历第三层结点的时候是先遍历的3的孩子,即5在前边,而不是4。

 

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        vector<int> temp;
        if(!root) return ans;
        bool flag = true;
        queue<TreeNode *> q;
        q.push(root);
        while(!q.empty()){
            int len = q.size();
            flag  = !flag;
            for(int i = 0; i < len; ++i){
                TreeNode *node = q.front();
                q.pop();
                temp.push_back(node->val);
                if(flag){
                    if(node->left) q.push(node->left);
                    if(node->right) q.push(node->right);
                }else{
                    if(node->right) q.push(node->right);
                    if(node->left) q.push(node->left);
                }
            }
            ans.push_back(temp);
            temp.clear();
        }
        return ans;

    }
};

还是按原先方法遍历,最后把每一行的遍历结点加入最终结果数组的时候再判断要不要将数组逆序即可。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        vector<int> temp;
        if(!root) return ans;
        bool flag = false;
        queue<TreeNode *> q;
        q.push(root);
        while(!q.empty()){
            int len = q.size();
            flag  = !flag;
            for(int i = 0; i < len; ++i){
                TreeNode *node = q.front();
                q.pop();
                temp.push_back(node->val);
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
            if(flag) ans.push_back(temp);
            else{
                reverse(temp.begin(), temp.end());
                ans.push_back(temp);
            }
            temp.clear();
        }
        return ans;

    }
};

机械臂开发必备:KDL库正逆解与动力学实战指南 在机器人算法领域,运动学与动力学计算是机械臂控制、仿真与轨迹规划的核心基础。正运动学描述关节空间到笛卡尔空间的映射,逆运动学则需要求解复杂的非线性方程,工程实现时常面临数值稳定性与调试效率的挑战。KDL(Kinematics and Dynamics Library)作为ROS生态中广泛使用的开源库,提供了统一的模型描述与高效求解器,将正逆解、雅可比矩阵及动力学参数计算封装为简洁接口,大幅降低开发门槛。无论是机械臂的笛卡尔空间轨迹跟踪,还是基于动力学模型的前馈控制,KDL都展现出强大的工程价值。本文从运动学 阅读详情

相关推荐

【第六届起重机创意大赛国一作品——资料分享】

文章目录前言一、比赛内容分析二、确定方案与作品模型1.方案简图2.作品模型三、电控部分控制思路单片机选择与资源分配拓展板的设计接线与走线代码分享总结

qq_19308801的博客 7781

二叉树的遍历问题总结

二叉树的遍历问题总结 二叉树的深度优先遍历、广度优先遍历和非递归遍历 二叉树的遍历: D:访问根结点,L:遍历根结点的左子树,R:遍历根结点的右子树。 给定一棵二叉树的前序遍历序列和中序遍历序列可以惟一确定一棵二叉树(后序遍历可以举出很多不唯一的反例)。 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。 深度优先遍历二叉树。 1. 中

11:00 啦 1239

深入理解HTTPS:从SSLHandshakeException到证书链验证的完整解析

本文深入解析了HTTPS握手过程中常见的SSLHandshakeException异常,特别是由证书链验证失败引发的CertPathValidatorException。文章从TLS握手流程、证书链验证的数学原理出发,详细剖析了Java中TrustManager的工作机制,并提供了针对证书链不完整、自签名证书等典型问题的系统化排查流程与实战解决方案。

weixin_29313423的博客 231

数据结构——二叉树遍历和常见问题

二叉树遍历 二叉树常见问题

weixin_57133901的博客 3645

解决vscode 连接服务器报错:The remote host may not meet VS Code Server‘s prerequisites for glibc and libstdc++

解决vscode远程连接服务器报错:The remote host may not meet VS Code Server's prerequisites for glibc and libstdc++ (The remote host does not meet the prerequisites for running VS Code Server)

qq_37200100的博客 9910

MFC实现简单UDP通信(附完整源码)

MFC实现简单UDP通信(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1109

二叉树,root.children的意思

root.children,返回root的子节点组成的数组,以数组形式。 root.children = [3 , 2 , 4] 一看代码结果就知道了 题目: 结果:

爱吃橘子的小翟 684

九天揽月带你玩转Ardupilot 的EKF2纸老虎(1)

目录 目录 摘要 1.kalman基础知识储备 摘要 本文主要记录自己学习ardupilot的ekf2代码的过程,相信很多人想移植或者学习ekf2,看到眼花缭乱的代码无从下手。九天揽月将带你玩转Ardupilot 的EKF2纸老虎 1.kalman基础知识储备 (1)先来看下最基础也是最重要的线性kalman 总结:不要害怕kalman,只要你可以懂得线性kal...

陌城烟雨 1万+

建立并遍历二叉树时遇到的问题(整理java版)

问题:开始Node root = null; 将root传入createBiTree(Node node)后,root的地址并没有改变; 代码环境:这里用递归的方式建立,并用前序方式遍历; 原因:由于在进入createBiTree(Nodenode)调用栈之前,没有给root申请地址,而是在调用栈中申请,所以root仍是空的; 解决方案: 改变传入root对象引用的方式,在createB...

一念流转 1444

SpringBoot一次请求中缓存数据,请求结束就清除的4种方法,你会几种?

通过以上四种方法,你可以在 SpringBoot 的一次请求中缓存数据,并在请求结束后自动清除这些缓存数据。使用 ThreadLocal:适用于需要跨多个方法调用的缓存数据,灵活性高,但需要注意内存泄漏问题。使用 AOP:适用于全局性的缓存管理,代码更加优雅,但需要对 AOP 有一定的了解。使用 ServletRequestListener:适用于简单的请求生命周期管理,配置简单,但功能相对有限。使用 HttpServletRequest 的 setAttribute 和 getAttribute。

java专栏 1295

手把手教你学pcie--(PCIe) 写请求的流程

通过上述流程,我们可以看到PCIe写请求的完整过程,包括请求的构建、发送、接收、处理和响应。这种请求-响应模型确保了数据传输的可靠性和有序性。

MHD0815的博客 158

二叉树层序遍历的变种问题

二叉树层序遍历的变种问题 1、按层打印二叉树,按层换行 分析:本质还是在考二叉树的层序遍历,问题的关键是啥时候换行。维护两个Node类型的遍历last(当前行的最右结点),nlast(下一行的最右结点)。当队列中弹出的值等于last的时候就知道该换行了,同时更新last就ok了。 Java代码: import java.util.LinkedList; import java.util.Queue...

博客 656

读懂ARM汇编程序,你只差这篇!保姆级教程(附完整示例剖析)!

ARM汇编中的符号、标号、伪操作有哪些?C语言和汇编语言如何混合编程?GNU ARM汇编和ARM汇编的区别有哪些?

车载系统攻城狮 1万+

LeetCode 第 102 号问题:二叉树的层序遍历

本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一。 个人网站:https://www.cxyxiaowu.com 题目来源于 LeetCode 上第 102 号问题:二叉树的层序遍历。题目难度为 Medium,目前通过率为 55.8% 。 题目描述 给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。 ...

程序员吴师兄的博客 298

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

二叉树的层序遍历经典问题(算法村第六关白银挑战)

层序遍历顺序不变,但对当前层节点的存储,我们维护一个变量 isOrderLeft ,记录结点存储是从左至右还是从右至左。从右向左层次遍历, 最后一个访问的节点必然是最底层最左侧叶子节点。在遍历完一层节点之后,将存储该层节点值的列表 list 添加到结果列表 ans 的头部即可。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)给定一棵二叉树的根节点。

cjj2543107638的博客 1207

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

二叉树总结-层序遍历能解决哪些问题?

【代码】二叉树总结-层序遍历能解决哪些问题?

m0_45955417的博客 125

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

二叉树的右侧视图问题详解与解法【层序遍历、DFS】

层序遍历适合一次性解决问题,逻辑简单明了,适合新手学习。深度优先搜索方法可以在某些场景下更高效,特别是当需要优先访问右子树时。两种方法都能有效解决二叉树的右侧视图问题。选择哪种方法取决于具体需求和问题规模。希望这篇文章能帮助你深入理解二叉树的右侧视图问题以及如何使用不同的算法解决它。

qq_22841387的博客 1574

广度优先遍历(图和二叉树的层序遍历相关问题)

广度优先搜索和深度优先搜索

weixin_46213145的博客 866

二叉树层序遍历相关题目

刷题路线来自代码随想录。

梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记 1738

二叉树的层序遍历的其它问题

一:求二叉树的宽度,打印二叉树最左侧节点,最右侧节点 /** * 层序遍历+输出最左节点+求最宽度 * @param root * @return */ public static int getMaxWidth(BinaryTreeNode root) { Queue<BinaryTreeNode> queue = new LinkedList<>(); if (...

xfjjs_net的博客 176

二叉树层序遍历的几个力扣例题

层序遍历的几个例题

the_singular的博客 1861

二叉树的层序遍历、之字形打印问题

二叉树的层序遍历 这是一道比较经典的问题,要求逐层遍历二叉树并打印节点,而且也有些变体。其实这不仅是一道考察对树形或图结构了解程度的问题,实现一个这样的函数其实能够帮助我们直观的打印一颗二叉树,在遇到复杂二叉树的问题时如果出现bug,也可以借助这种方式可视化出来调试。这个问题本身也有一些变体问题。 如上图所示,这是一颗二叉树,我们以他为例讨论。 1· 最直接的层序遍历 简单的层序遍历只要从最上层...

andyL_05的博客 930

二叉树层序遍历插入空节点占位问题的分析与解决(Python实现)

-

zorchp 881

二叉树的层序遍历经典问题

首先 这需要vector容器和queue容器的知识 以上知识可以通过文档对照的去看然后 最花费时间的还是在找教程上面 最好优先对照leetcode上面的解析高赞看一遍 而不是在csdn搜索 这样效率比较高 leetcode上面讲的还是很不错的。

weixin_75149154的博客 482

二叉树的层序遍历和相关的基础问题

层序遍历是从顶层的根节点开始,再自左向右访问第二层的结点,访问完成之后,再自左向右访问第三层结点,直到最后一个结点停止. 二叉树中结点个数,叶子个数,以及查找指定值等.

weixin_47257473的博客 767

二叉树层序遍历及完全二叉树问题问题

思路:和遍历二叉树相似,也是用队列解决,先把树根入队,然后标记队头并把队头删除,把队头的左右结点依次入队列,但是当队列为空的时候,停止操作,检查队列剩余结点,如果结点都是空是则是完全二叉树,否则不是完全二叉树。建立一个队列,把树根入队列,然后把队头元素打印并删掉,然后把它的左右结点依次入队,如果结点为空的话就不入队,依次这样操作,当队列为空时,就完成层序遍历了。然后把队头A删掉,把队头的左右BC结点依次入队。然后把队头D删掉,它的左右结点为空,不用入队。然后把队头E删掉,它的左右结点为空,不用入队。

2301_77987288的博客 449
上一篇: leetcode300. 最长递增子序列
下一篇: 剑指offer 07. 重建二叉树
罗古洞的女婿
博客等级 码龄10年 1117粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值