Populating Next Right Pointers in Each Node - LeetCode
Posted multhree
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Populating Next Right Pointers in Each Node - LeetCode相关的知识,希望对你有一定的参考价值。
题目链接
Populating Next Right Pointers in Each Node - LeetCode
注意点
- 不要访问空结点
- 二叉树是满二叉树也就是说如果有左节点一定会有右节点
解法
解法一:递归,DFS。因为是完美二叉树所以左子结点的next指针可以直接指向其右子节点,对于其右子节点的处理方法是,判断其父节点的next是否为空,若不为空,则指向其next指针指向的节点的左子结点,若为空则指向NULL。
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() {}
Node(int _val, Node* _left, Node* _right, Node* _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
class Solution {
public:
Node* connect(Node* root) {
if(!root) return NULL;
if(root->left)
{
root->left->next = root->right;
if(root->next) root->right->next = root->next->left;
}
connect(root->left);
connect(root->right);
return root;
}
};
解法二:非递归。程序遍历每层的节点都按顺序加入queue中,而每当从queue中取出一个元素时,将其next指针指向queue中下一个节点即可。
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() {}
Node(int _val, Node* _left, Node* _right, Node* _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
class Solution {
public:
Node* connect(Node* root) {
if(!root) return NULL;
queue<Node*> q;
q.push(root);
while(!q.empty())
{
int size = q.size();
for(int i = 0;i < size;i++)
{
Node* temp = q.front();q.pop();
if(i != size-1) temp->next = q.front();
if(temp->left) q.push(temp->left);
if(temp->right) q.push(temp->right);
}
}
return root;
}
};
小结
- 只要是遍历都有递归和非递归两种写法
以上是关于Populating Next Right Pointers in Each Node - LeetCode的主要内容,如果未能解决你的问题,请参考以下文章
树Populating Next Right Pointers in Each Node
116. Populating Next Right Pointers in Each Node
116. Populating Next Right Pointers in Each Node
116. Populating Next Right Pointers in Each Node