-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathtree.cpp
104 lines (104 loc) · 2.53 KB
/
tree.cpp
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
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <stack>
using namespace std;
struct TreeLinkNode {
int val;
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
TreeLinkNode(int x) : val(x), left(nullptr), right(nullptr), next(nullptr){}
};
struct Bucket {
TreeLinkNode *node;
int level;
Bucket(TreeLinkNode *p, int l) : node(p), level(l){}
};
class Solution {
public:
void connect(TreeLinkNode *root) {
if (root == nullptr)
return;
TreeLinkNode *p = root;
while (p) {
TreeLinkNode *q = p;
TreeLinkNode *t1 = getNext(q);
TreeLinkNode *t2;
while (t1) {
if (t1 == q->left) { // 如果t1是左孩子
t2 = q->right; // 令t2是它的右孩子,(可能为null)
} else {
t2 = nullptr; // 否则t1已经是右孩子,t2必须从下一个节点寻找
}
if (t2 == nullptr) {
q = q->next; // 从下一个节点寻找t2
t2 = getNext(q);
}
if (t2 == nullptr) // t2为null,说明没有找到最右相邻节点
break;
t1->next = t2; // 更新t1的next指针指向t2
t1 = t2;
}
p = getNext(p); // 处理下一层节点,注意下一层的最初节点就是p的下一层节点的最左节点,即getNext(p)
}
}
void print(TreeLinkNode *root) {
if (root == nullptr)
return;
TreeLinkNode *p = root;
while (p) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
root = getNext(root);
print(root);
}
private:
TreeLinkNode *getNext(TreeLinkNode * &p) {
if (p == nullptr)
return nullptr;
TreeLinkNode *next = getChild(p);
if (next)
return next;
p = p->next;
return getNext(p);
}
TreeLinkNode *getChild(TreeLinkNode *p) {
return p->left ? p->left : p->right;
}
};
TreeLinkNode *mk_node(int val)
{
return new TreeLinkNode(val);
}
TreeLinkNode *mk_child(TreeLinkNode *root, TreeLinkNode *left, TreeLinkNode *right)
{
root->left = left;
root->right = right;
return root;
}
TreeLinkNode *mk_child(TreeLinkNode *root, int left, int right)
{
return mk_child(root, new TreeLinkNode(left), new TreeLinkNode(right));
}
TreeLinkNode *mk_child(int root, int left, int right)
{
return mk_child(new TreeLinkNode(root), new TreeLinkNode(left), new TreeLinkNode(right));
}
int main(int argc, char **argv)
{
Solution solution;
TreeLinkNode *root = mk_child(0,1,2);
mk_child(root->left, mk_node(3), nullptr);
mk_child(root->right, nullptr, mk_node(4));
mk_child(root->left->left,5, 6);
mk_child(root->right->right,7,8);
solution.connect(root);
solution.print(root);
return 0;
}