LeetCode Day18

88 阅读2分钟

513.找树左下角的值

给定一个二叉树,在树的最后一行找到最左边的值。 示例 1: 示例 2:

思路

这道题的主要思路是使用宽度优先搜索(Breadth-First Search, BFS)来按层次遍历二叉树。在遍历的过程中,我们特别关注每一层的第一个节点,即最左边的节点。

  1. 初始化队列和结果变量:创建一个队列q来保存待遍历的节点,并初始化一个变量bottomLeftValue用于保存最底层最左边节点的值。
  2. 根节点入队:将二叉树的根节点root加入队列q
  3. 按层遍历:当队列不为空时,执行以下操作:
  • 获取当前层的节点数量(即队列的大小)。
  • 对于当前层的每一个节点,进行以下操作:
    1. 从队列中取出节点。
    2. 如果是该层的第一个节点(即最左边的节点),则更新bottomLeftValue
    3. 将该节点的左右子节点(如果存在)加入队列。
  1. 返回结果:遍历完成后,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;  // 返回最底层最左边节点的值
    }
};