-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpopulating_next_right_pointers2.cpp
More file actions
134 lines (121 loc) · 2.8 KB
/
populating_next_right_pointers2.cpp
File metadata and controls
134 lines (121 loc) · 2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// =====================================================================================
//
// Filename: populating_next_right_pointers2.cpp
//
// Description: 117. Populating Next Right Pointers in Each Node II.
//
// Version: 1.0
// Created: 08/15/2019 08:51:21 PM
// Revision: none
// Compiler: g++
//
// Author: Zhu Xianfeng (), xianfeng.zhu@gmail.com
// Organization:
//
// =====================================================================================
#include <stdio.h>
// Definition for a Node.
struct Node
{
int val;
Node* left;
Node* right;
Node* next;
Node() {}
Node(int _val, Node* _left, Node* _right, Node* _next)
{
val = _val;
left = _left;
right = _right;
next = _next;
}
};
// Iterative, BFS
class Solution1
{
public:
Node* connect(Node* root)
{
auto link_node = [](Node** head, Node** tail, Node* node) {
if (node != nullptr)
{
if (*head == nullptr)
{
*head = node;
}
if (*tail != nullptr)
{
(*tail)->next = node;
}
*tail = node;
}
};
Node* cur = root;
Node* head = nullptr;
Node* tail = nullptr;
while (cur != nullptr)
{
head = nullptr;
tail = nullptr;
while (cur != nullptr)
{
link_node(&head, &tail, cur->left);
link_node(&head, &tail, cur->right);
cur = cur->next;
}
cur = head;
}
return root;
}
};
// Recursive, DFS
class Solution2
{
public:
Node* connect(Node* root)
{
if (root == nullptr)
{
return root;
}
if (root->left != nullptr)
{
if (root->right != nullptr)
{
root->left->next = root->right;
}
else
{
root->left->next = getNext(root->next);
}
}
if (root->right != nullptr)
{
root->right->next = getNext(root->next);
}
// Connect subnodes
connect(root->right);
connect(root->left);
return root;
}
private:
Node* getNext(Node* node)
{
if (node == nullptr) {
return node;
} else if (node->left != nullptr) {
return node->left;
} else if (node->right != nullptr) {
return node->right;
} else {
return getNext(node->next);
}
}
};
using Solution = Solution2;
int main(int argc, char* argv[])
{
Node* root = nullptr;
root = Solution().connect(root);
return 0;
}