LeetCode 面试经典 150_二叉树_填充每个节点的下一个右侧节点指针 II(73_117_C++_中等)(BFS)
LeetCode 面试经典 150_二叉树_填充每个节点的下一个右侧节点指针 II(73_117_C++_中等)
- 题目描述:
- 输入输出样例:
- 题解:
- 解题思路:
- 思路一(BFS):
- 代码实现
- 代码实现(思路一(BFS)):
题目描述:
给定一个二叉树:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。
初始状态下,所有 next 指针都被设置为 NULL 。
输入输出样例:
示例 1:
输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),‘#’ 表示每层的末尾。
示例 2:
输入:root = []
输出:[]
提示:
树中的节点数在范围 [0, 6000] 内
-100 <= Node.val <= 100
题解:
解题思路:
思路一(BFS):
1、通过题意分析,需要一层一层的处理结点,自然的会想到层次遍历对每层进行处理。
2、复杂度分析:
① 时间复杂度:O(N)。我们需要遍历这棵树上所有的点,时间复杂度为 O(N)。
② 空间复杂度:O(N)。即队列的空间代价。
代码实现
代码实现(思路一(BFS)):
class Solution {
public:Node* connect(Node* root) {// 如果根节点为空,直接返回if(root == NULL) {return root;}// 使用队列进行层次遍历queue<Node *> Q;// 把根节点压入队列Q.push(root);// 循环遍历树的每一层int size; // 每次循环时队列的大小表示当前层节点的个数while(!Q.empty()) {size = Q.size(); // 获取当前层的节点数// 遍历当前层的每个节点while(size--) {// 取出队列中的第一个节点Node *curNode = Q.front();Q.pop(); // 弹出队列中的节点// 如果当前节点不是当前层的最后一个节点,设置它的next指针if(size >= 1) {curNode->next = Q.front(); // 将当前节点的next指向队列中的下一个节点}// 如果当前节点有左子节点,压入队列if(curNode->left != NULL) {Q.push(curNode->left);}// 如果当前节点有右子节点,压入队列if(curNode->right != NULL) {Q.push(curNode->right);}}}// 返回修改过的树的根节点return root;}
};
LeetCode 面试经典 150_二叉树_填充每个节点的下一个右侧节点指针 II(73_117)原题链接
欢迎大家和我沟通交流(✿◠‿◠)
