题目:
You are given a perfect binary tree where all leaves are on the same level, and every parent has two children. The binary tree has the following definition:
struct Node { int val; Node *left; Node *right; Node *next; }
Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL
.
Initially, all next pointers are set to NULL
.
Follow up:
- You may only use constant extra space.
- Recursive approach is fine, you may assume implicit stack space does not count as extra space for this problem.
Example 1:
Input: root = [1,2,3,4,5,6,7] Output: [1,#,2,3,#,4,5,6,7,#] Explanation: Given the above perfect binary tree (Figure A), your function should populate each next pointer to point to its next right node, just like in Figure B. The serialized output is in level order as connected by the next pointers, with '#' signifying the end of each level.
Constraints:
- The number of nodes in the given tree is less than
4096
. -1000 <= node.val <= 1000
思路:
题目本质是二叉树的按层遍历,常规BFS解法是用queue记录每一层,然后next指向下一个,如果没有下一个则指向NULL即可。这里讲一讲不需要extra space的方法,递归。给定的是perfect binary tree,所以所有非叶子node都有左右两子。递归处理,如果为空则返回,左子的next为右子。对于右子,分开分析:如果当前节点有next,则右子是当前节点next的左子,否则说明当前节点右边没了,则即当前节点的next为NULL,则当前节点右子的next同样应为NULL。
代码:
/*
// 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:
Node* connect(Node* root) {
if(!root)
return root;
if(root->left)
root->left->next=root->right;
if(root->right)
root->right->next=root->next?root->next->left:NULL;
connect(root->left);
connect(root->right);
return root;
}
};