513.找树左下角的值
给定一个二叉树,在树的最后一行找到最左边的值。 示例 1:
示例 2:
思路
这道题的主要思路是使用宽度优先搜索(Breadth-First Search, BFS)来按层次遍历二叉树。在遍历的过程中,我们特别关注每一层的第一个节点,即最左边的节点。
- 初始化队列和结果变量:创建一个队列
q来保存待遍历的节点,并初始化一个变量bottomLeftValue用于保存最底层最左边节点的值。 - 根节点入队:将二叉树的根节点
root加入队列q。 - 按层遍历:当队列不为空时,执行以下操作:
- 获取当前层的节点数量(即队列的大小)。
- 对于当前层的每一个节点,进行以下操作:
- 从队列中取出节点。
- 如果是该层的第一个节点(即最左边的节点),则更新
bottomLeftValue。 - 将该节点的左右子节点(如果存在)加入队列。
- 返回结果:遍历完成后,
bottomLeftValue即为最底层最左边节点的值。
通过这种方式,我们可以确保bottomLeftValue总是保存当前已遍历层次的最左边节点的值。由于我们是按层次遍历的,所以最后一次更新的bottomLeftValue即为最底层最左边节点的值。
题解
/**
* 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 findBottomLeftValue(TreeNode* root) {
queue<TreeNode*> q; // 使用队列保存每一层的节点
q.push(root); // 将根节点加入队列
int bottomLeftValue = 0; // 初始化最底层最左边节点的值
while (!q.empty()) {
int size = q.size(); // 当前层节点的数量,要先把size取出来,因为size不断变化
for (int i = 0; i < size; ++i) {
TreeNode* currentNode = q.front(); // 取出当前层的第一个节点
q.pop(); // 从队列中移除该节点
if (i == 0) {// 如果是该层的第一个节点,更新最底层最左边节点的值
bottomLeftValue = currentNode->val;
}
// 将当前节点的左右子节点加入队列(如果存在)
if (currentNode->left) {
q.push(currentNode->left);
}
if (currentNode->right) {
q.push(currentNode->right);
}
}
}
return bottomLeftValue; // 返回最底层最左边节点的值
}
};