notes/OJ notes/pages/Leetcode Populating-Next-Right-Pointers-In-Each-Node.md

140 lines
3.1 KiB
Markdown
Raw Normal View History

2022-07-16 09:56:01 +08:00
# Leetcode Populating-Next-Right-Pointers-In-Each-Node
#### 2022-07-16 09:43
> ##### Algorithms:
> #algorithm #BFS #optimization #DFS
> ##### Data structures:
> #DS #binary_tree
> ##### Difficulty:
> #coding_problem #difficulty-medium
> ##### Additional tags:
> #leetcode
> ##### Revisions:
> N/A
##### Related topics:
```expander
tag:#BFS
```
##### Links:
- [Link to problem](https://leetcode.com/problems/populating-next-right-pointers-in-each-node/)
___
### Problem
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`.
#### Examples
**Example 1:**
![](https://assets.leetcode.com/uploads/2019/02/14/116_sample.png)
**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.
**Example 2:**
**Input:** root = []
**Output:** []
#### Constraints
**Constraints:**
- The number of nodes in the tree is in the range `[0, 212 - 1]`.
- `-1000 <= Node.val <= 1000`
### Thoughts
> [!summary]
> This is a #BFS problem, and cam be optimized
##### BFS way of doing this, O(n)time, O(n + 1)space
simple BFS, for each level, connect the node to the next.
Remember to get the for loop right.
#####
##### Also can be done with DFS
### Solution
BFS unoptimized:
```cpp
/*
// 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) {
// BFS.
// Can we do it with DFS?
queue<Node*> todo;
if (root && root->left && root->right) {
todo.push(root->left);
todo.push(root->right);
}
Node *ptr, *nextPtr;
while (!todo.empty()) {
nextPtr = todo.front();
todo.pop();
for (size_t i = 0, size = todo.size(); i < size; i++) {
ptr = nextPtr;
nextPtr = todo.front();
todo.pop();
ptr->next = nextPtr;
if (ptr->left) {
todo.push(ptr->left);
todo.push(ptr->right);
}
}
if (nextPtr->left) {
todo.push(nextPtr->left);
todo.push(nextPtr->right);
}
}
return root;
}
};
```