一、题目描述如下
leetcode原题链接: 力扣https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/
二、思路分析
由题意可知,本题给出的条件是一个完美的二叉树。所以在考虑具体操作和边界问题的时候,可以不需要判断左右儿子是否存在的问题。
对于题目本身来说,在根节点不为空的情况下,存在三种情况(以示例1二叉树的前三层为例):
- 最右侧这一列的节点全部指向空(root->next=NULL)。
- 在相同的子树中,左儿子指向右儿子(root->left->next=root->right)。
- 在不同的子树中,节点的右儿子指向同层相邻节点的左儿子。
示意图如下所示:
通过以上分析我们可以发现,二叉树的每一层都是从最左侧节点开始的。所以,我们可以用迭代法对二叉树的最左侧节点进行遍历。
算法步骤:
- 判断根节点是否为空,如是返回NULL;
- 定义一个新的指针指向根节点,保持原函数的输入根节点的指针不变,有利于最后的输出;
- 定义一个while嵌套循环,判断以上的三种情况,并做出出相应的操作;
- 遍历完成,返回根节点。
三、代码实现
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *left;
* struct Node *right;
* struct Node *next;
* };
*/
struct Node* connect(struct Node* root) {
if(root==NULL)
{
return NULL;
}
struct Node *leftmost=root;
while(leftmost->left!=NULL) //对二叉树的最左侧节点进行遍历操作
{
struct Node* head=leftmost; //临时变量储存leftmost,便于后续操作
while(head!=NULL) //对该层的节点进行遍历操作
{
head->left->next=head->right; //在相同子树之间的情况
if(head->next!=NULL)
{
head->right->next=head->next->left; //在不同子树之间的情况
}
head=head->next;
}
leftmost=leftmost->left;
}
return root;
}