- 题目:
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
- 解题思路
1.递归法
递归出口:
如果节点为空,则直接返回
若果节点左右节点存在,则节点的左孩子指向节点的右孩子;若节点的next节点不为空,则节点的right指向next的left
一般情况:递归左子树,递归右子树
代码实现:
Node* connect(Node* root) {
if(!root)
return root;
if(root->left && root->right) {
root->left->next = root->right;
if(root->next){
root->right->next = root->next->left;
}
}
connect(root->left);
connect(root->right);
return root;
}
方法二:迭代法
Node* connect(Node* root) {
if(!root) return root;
Node* left_node = root->left; //始终记录下一个最左边节点的位置
Node* cur = root; //工作指针
while(cur->left && cur->right) {
cur->left->next = cur->right; //左右孩子节点存在时,左孩子指向右孩子
if(cur->next) { //next节点存在时,右孩子指向next的左孩子
cur->right->next = cur->next->left;
cur = cur->next;
} else { //next为空时,更新cur为最左边的节点
cur = left_node;
left_node = left_node->left;
}
}
return root;
}