题目描述
给定一个二叉树
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。
如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
进阶:
你只能使用常量级额外空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
示例
输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,
以指向其下一个右侧节点,如图 所示。
算法1
主要考虑树的上下移动与横向链表的移动
树的移动在函数递归中解决
横向链表使用一个while(p->next!=NULL) p=p->next;也可以解决
两者结合就是在递归函数中要传递横向链表。
考虑到横向链表的头的下一层也可以通过横向链表获取,所以递归传递每一层的横向链表的头
C++ 代码
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() : val(0), left(NULL), right(NULL), next(NULL) {}
Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
Node(int _val, Node* _left, Node* _right, Node* _next)
: val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
public:
void dfs(Node* start ,Node* root)
{
if (root == NULL) return;
if (start == NULL) start = root;
if ( start != root){
Node* p = start;
while (p!= NULL && p->next != NULL) p = p->next;
p->next = root;
}
Node* nextStart = NULL;
while (start != NULL) {
nextStart = (start->left == NULL ? start->right: start->left);
if (nextStart == NULL) {
start = start->next;
}
else {
break;
}
}
dfs(nextStart, root->left);
dfs(nextStart, root->right);
}
Node* connect(Node* root) {
dfs(NULL,root);
return root;
}
};