【LeetCode刷题日志】:在每个树行中找最大值 、填充每个节点的下一个右侧节点指针

112 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

1、写在前面

大家好,这里是【LeetCode刷题日志】。今天的两道题分别是:

  • 在每个树行中找最大值
  • 填充每个节点的下一个右侧节点指针

2、内容

2.1、题目一

链接:515. 在每个树行中找最大值 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

image.png

image.png

(3) 解题

参考代码:

/**
 * 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> result;     // 定义一个vector容器的结果集
        queue<TreeNode*> que;   // 定义一个工作队列
        if(root) que.push(root);// 如果根结点不为空,则入队
        else return result;     // 否则返回空数组
        // 当队列为空时退出循环
        while ( !que.empty() ) {
            int size  = que.size();         // 取到当前队列的长度
            int max = (que.front())->val;   // 定义变量max初始化为队头元素的值
            // 遍历本层结点
            for(int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                // 取到最大值
                max =  max > (node->val) ? max : (node->val);
                // 将队头元素弹出
                que.pop();
                // 向左访问
                if(node->left) que.push(node->left);
                // 向右访问
                if(node->right) que.push(node->right);
            }
            // 将本层结点中的最大值存入结果中
            result.push_back(max);
        }
        // 最后返回结果
        return result;
    }
};

2.2、题目二

链接:116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

image.png

(3) 解题

参考代码:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        queue<Node*> que;           // 定义一个工作队列
        if(root) que.push(root);    // 如果当前根结点不为空,则入队
        else return root;           // 否则返回直接返回根结点
        // 当队列为空时退出循环
        while (!que.empty()) {
            int size = que.size();  // 取到当前队列的长度
            Node* temp;             // 定义一个工作结点
            // 遍历本层结点
            for(int i = 0; i<size; i++) {
                temp = que.front();         // 工作结点指向队头元素
                que.pop();                  // 弹出队头元素
                temp->next = que.front();   // 修改工作结点的next指针
                if(temp->left) que.push(temp->left);    // 向左访问
                if(temp->right) que.push(temp->right);  // 向右访问
            }
            // 此时temp指向了本层的最后一个结点,将其置为NULL
            temp->next = NULL;
        }
        // 最后返回根结点
        return root;
    }  
};

3、写在最后

好的,今天就先刷到这里。