提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
树的层序遍历,队列
本文是关于leetcode平台的三篇算法书的题的各个题目解答的解答,这是初级算法的讲解的第一篇,初级算法前面还有很多题,但是本人比较懒,就有空再写了
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目描述
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
树中节点数目在范围 [0, 2000] 内
-1000 <= Node.val <= 100
二、思路讲解
1.联想
这道题是将树中的节点值按层序装到数组中,首先这道题很容易想到树的层序打印,我们利用队列将树中每一层的节点值装到队列中,输出当前一层节点值,同时将下一层的节点值进入队列里,下面先给出此种代码,下面的代码相信大家都能看懂,那么我们只需要在此代码的基础上稍加修改就可以了。
class Solution {
public:
void levelOrder(TreeNode* root) {
queue<TreeNode*> nums;
int ret;
nums.push(root);
while(!nums.empty()){
ret = nums.size();
for(int i = 0; i < ret; i++){
cout<<nums.front()->val<<" ";
if(nums.front()->left != nullptr){
nums.push(nums.front()->left);
}
if(nums.front()->right != nullptr){
nums.push(nums.front()->right);
}
nums.pop();
}
cout<<""<<endl;
}
}
};
2.代码分析
代码如下(示例):修改的地方主要是加了一个get_num数组,每次将树的各个层的节点值装到num中,当然别忘了每次把数据清除。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> num;
queue<TreeNode*> nums;
int ret;
vector<int> get_num;
if(root == nullptr)return num;
nums.push(root);
while(!nums.empty()){
ret = nums.size();
for(int i = 0; i < ret; i++){
get_num.push_back(nums.front()->val);
if(nums.front()->left != nullptr){
nums.push(nums.front()->left);
}
if(nums.front()->right != nullptr){
nums.push(nums.front()->right);
}
nums.pop();
}
num.push_back(get_num);
get_num.clear();
}
return num;
}
};
总结
这是一道比较基础的树的题,大家只要用心思考肯定能做出来,还有一个关于leetcode的东西,就是当时我做leetcode经常报俩个错误
Line 23: Char 49: runtime error: member access within null pointer of type 'TreeNode' (solution.cpp) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior solution.cpp:23:49
这个是忘记考虑root为空的情况
最后达成成就,发表第一篇博客!