leetcode 层序遍历之我要打十个(上)

  1. 二叉树的层序遍历
    给你二叉树的根节点 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 <= 1000

代码:
class Solution {
public:
vector<vector> levelOrder(TreeNode* root) {
queue<TreeNode*> q;
if(root!=NULL) q.push(root);
vector<vector> result;
while(!q.empty()){
int size=q.size();
vector v;
for(int i=0;i<size;i++){
TreeNode* node=q.front();
q.pop();
v.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
result.push_back(v);
}
return result;

}

};

在这里插入图片描述
`107. 二叉树的层序遍历 II
给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]
示例 2:

输入:root = [1]
输出:[[1]]
示例 3:

输入:root = []
输出:[]

提示:

树中节点数目在范围 [0, 2000] 内
-1000 <= Node.val <= 1000

代码:
class Solution {
public:
vector<vector> levelOrderBottom(TreeNode* root) {
queue<TreeNode*> q;
if(root!=NULL) q.push(root);
vector<vector> result;
while(!q.empty()){
int size=q.size();
vector v;
for(int i=0;i<size;i++){
TreeNode* node=q.front();
q.pop();
v.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
result.push_back(v);
}
reverse(result.begin(),result.end());
return result;
}
};

思路:在原本的基础上加了一个逆序
在这里插入图片描述
199. 二叉树的右视图
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:

输入: [1,null,3]
输出: [1,3]
示例 3:

输入: []
输出: []

提示:

二叉树的节点个数的范围是 [0,100]
-100 <= Node.val <= 100
第一反应:如果没有左视图我是不认可的,绝对还有一道左视图
思路:因为只需要右视图,每层只有一个,所以把每层最后一个元素push到result就可以
代码:
class Solution {
public:
vector rightSideView(TreeNode* root) {
queue<TreeNode*> q;
if(root!=NULL) q.push(root);
vector result;
while(!q.empty()){
int size=q.size();
for(int i=0;i<size;i++){
TreeNode* node=q.front();
q.pop();
if(i==size-1) result.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return result;
}
};
在这里插入图片描述
637. 二叉树的层平均值
给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。
示例 2:

输入:root = [3,9,20,15,7]
输出:[3.00000,14.50000,11.00000]

提示:

树中节点数量在 [1, 104] 范围内
-231 <= Node.val <= 231 - 1

思路:增加一个double求下试试看:
代码:
class Solution {
public:
vector averageOfLevels(TreeNode* root) {
queue<TreeNode*> q;
if(root!=NULL) q.push(root);
vector result;
while(!q.empty()){
int size=q.size();
double average=0;
for(int i=0;i<size;i++){
TreeNode* node=q.front();
q.pop();
average=average+node->val;
if (i==size-1){
average=average/size;
result.push_back(average);
}
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return result;
}
};

在这里插入图片描述
429. N 叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]
示例 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,4,5],[6,7,8,9,10],[11,12,13],[14]]

提示:

树的高度不会超过 1000
树的节点总数在 [0, 10^4] 之间
思路:默默看了一眼孩子代码:
代码:
class Solution {
public:
vector<vector> levelOrder(Node* root) {
queue<Node*> q;
if(root!=NULL) q.push(root);
vector<vector> result;
while(!q.empty()){
int size=q.size();
vector v;
for(int i=0;i<size;i++){
Node* node=q.front();
q.pop();
v.push_back(node->val);
for(int j=0;jchildren.size();j++){
if (node->children[j]) q.push(node->children[j]);
}
}
result.push_back(v);
}
return result;
}
};
打的时候居然莫名其妙报错了。于是重新打了一遍
在这里插入图片描述
515. 在每个树行中找最大值
给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例1:

输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]
示例2:

输入: root = [1,2,3]
输出: [1,3]

提示:

二叉树的节点个数的范围是 [0,104]
-231 <= Node.val <= 231 - 1

思路:需要注意最大值要取INT_MIN
代码:
class Solution {
public:
vector largestValues(TreeNode* root) {
queue<TreeNode*> q;
if(root!=NULL) q.push(root);
vector result;
while(!q.empty()){
int size=q.size();
int max=INT_MIN;
for(int i=0;i<size;i++){
TreeNode* node=q.front();
q.pop();
if (node->val>max){
max=node->val;
}
if (i==size-1){
result.push_back(max);
}
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return result;
}
};
在这里插入图片描述
吃个饭下午继续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值