填充每个节点的下一个右侧节点指针
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
示例 1:
输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvijdh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这就是层次遍历嘛。然后加一个next指针就好了呗。\
class Solution {
public:
Node* connect(Node* root) {
if(root == nullptr){
return root;
}
queue<Node*> myqueue;
myqueue.push(root);
while(!myqueue.empty())
{
int n = myqueue.size();
for(int i = 0;i<n;i++){
Node* Ne = myqueue.front();
myqueue.pop();
if(i<n-1){
Ne->next = myqueue.front();
}
if(Ne->left != nullptr){
myqueue.push(Ne->left);
}
if(Ne->right != nullptr){
myqueue.push(Ne->right);
}
}
}
return root;
}
};
方法二:
完全二叉树,这个题的next指针只有两种,
第一种是同父亲的next指针,同父亲的也只有左指针才能next到 同父亲的右指针
node->left->next = node->right;
第二种是异父亲的next指针。A指针的右孩子的next指向B指针左孩子
问题就是如何得到A右孩子B左孩子的next的链接。
假设我们已经将第 N层的next建立完成,我们第N+1层的节点关系也就明了,第N+1层的各个父节点我们可以通过第N层的next指针得到,也就可以使得第N+1层的所有的关系。
故node->right->next = node->next->left;
class Solution {
public:
Node* connect(Node* root) {
if (root == nullptr) {
return root;
}
// 从根节点开始
Node* leftmost = root;
while (leftmost->left != nullptr) {
// 遍历这一层节点组织成的链表,为下一层的节点更新 next 指针
Node* head = leftmost;
while (head != nullptr) {
// CONNECTION 1
head->left->next = head->right;
// CONNECTION 2
if (head->next != nullptr) {
head->right->next = head->next->left;
}
// 指针向后移动
head = head->next;
}
// 去下一层的最左的节点
leftmost = leftmost->left;
}
return root;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/solution/tian-chong-mei-ge-jie-dian-de-xia-yi-ge-you-ce-2-4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。