/
1028. 从先序遍历还原二叉树.cpp
142 lines (118 loc) · 3.5 KB
/
1028. 从先序遍历还原二叉树.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
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
135
136
137
138
139
140
141
142
/*
我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
*/
//方法一:用栈维护从根节点到当前节点上所有的节点
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* recoverFromPreorder(string S) {
int pos=0;
stack<TreeNode*> path;
while(pos<S.size()){
int level = 0;
while(S[pos]=='-'){
pos++;
level++; //当前节点的深度信息
}
string val="";
while(pos<S.size()&&S[pos]!='-'){
val+=S[pos];
pos++;
}
TreeNode* node = new TreeNode(stoi(val));
if(path.size()==level){//当前节点是上一个节点的左子节点
if(!path.empty()){
path.top()->left = node;
}
}
else{//当前节点是根节点到上一节点(不包括上一节点)的右子节点
while(level!=path.size()){
path.pop();
}
path.top()->right = node;
}
path.push(node);
}
while(path.size()>1){
path.pop();
}
return path.top();
}
};
//方法二:自己的方法
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* recoverFromPreorder(string S) {
string val="";
int i=0;
while(S[i]!='-'){
val=val+S[i];
i++;
if(i==S.size()){break;}
}
auto root = new TreeNode(stoi(val)); //根节点的值
TreeNode* r = root;
TreeNode* prer = root;
int precnt = 0;
for(i;i<S.size();i++){
int cnt=0;
while(S[i]=='-'){
cnt++;
i++;
}
//得到当前节点的值
string val="";
while(S[i]!='-'){
val=val+S[i];
i++;
if(i==S.size()){break;}
}
i--;
if(cnt>precnt){//左节点
precnt = cnt; //前一个-的个数
r->left = new TreeNode(stoi(val));
prer = r;
r = r->left;
//cout<<i;
}
else if(cnt==precnt){ //和前一个-d相等说明父结点一样
prer->right = new TreeNode(stoi(val));
r = prer->right;
}
else{
r = root;
precnt = cnt; //前一个-的个数
while(cnt>1){
if(r->right){r = r->right;}
else{
r = r->left;
}
cnt--;
}
r->right = new TreeNode(stoi(val));
r = r->right;
}
}
return root;
}
};