持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第33天,点击查看活动详情
题目链接:515. 在每个树行中找最大值
题目描述
给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
提示:
- 二叉树的节点个数的范围是
示例 1:
输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]
示例 2:
输入: root = [1,2,3]
输出: [1,3]
整理题意
题目给定一棵二叉树的根节点 root,要求我们以数组的形式返回二叉树中每一层的最大值,如 ans[i] 表示第 i 层的最大值。
解题思路分析
遇到树形题目,通常情况是需要遍历树:
-
该题要求我们找到给定的二叉树每一层的最大值,这里遍历每一层的思想类似于
BFS广度优先搜索 的思想,由近到远的层序遍历,这里可以把根节点看作广度优先搜索的起点,一层一层的向外遍历,期间记录每一层的最大值即可。 -
当然遍历也可以使用
DFS深度优先搜索,在深度优先搜索时需要记录当前遍历到的层数,不断维护每一层的最大值即可。
具体实现
- 特判根节点为空时,返回空数组。
- 将根节点作为遍历的起点放入队列。
- 每次取出队列中所有元素,表示这些元素在同一层。
- 然后遍历这些元素,将他们的左右节点依次放入队列,作为下一层即将遍历的元素。
- 在遍历这些元素的时候,记录每一层中最大的元素即可。
- 最后返回答案数组。
复杂度分析
- 时间复杂度:,其中
n为二叉树节点个数,每一个节点仅会进出队列一次。 - 空间复杂度:,存储二叉树节点的空间开销。
代码实现
/**
* 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<int> largestValues(TreeNode* root) {
vector<int> ans;
ans.clear();
//如果根节点为空,返回空数组
if(root == nullptr) return ans;
//BFS层序遍历
queue<TreeNode*> que;
while(que.size()) que.pop();
que.push(root);
while(que.size()){
//n为当前层元素个数
int n = que.size();
//m记录当前层最大值,初始化为最小值
int m = INT_MIN;
//遍历当前层所有元素
for(int i = 0; i < n; i++){
TreeNode* now = que.front();
que.pop();
//维护当前层最大值 m
m = max(m, now->val);
//压入左右节点(如果不为空指针)
if(now->left != nullptr) que.push(now->left);
if(now->right != nullptr) que.push(now->right);
}
//记录当前层最大值
ans.push_back(m);
}
return ans;
}
};
总结
- 该题核心思想为遍历,通过
BFS广度优先搜索 可以实现二叉树的层序遍历,通过层序遍历记录每层最大值即可。 - 还可以使用
DFS深度优先搜索 来完成,在遍历时需要记录此时的层数,当我们遍历到某一层的元素时,只需维护对应层的最大值即可。 - 测试结果:
结束语
如果觉得生活不如意,不要一直钻牛角尖,去读读书吧,和书中的人物共历悲欢。当你了解了不一样的人生,收获了不一样的思想,你会发现,眼前的困难都是暂时的,人也就蓄满了重新出发的力量。