Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5849641

Browse files
Create Recover a Tree From Preorder Traversal
1 parent d65793a commit 5849641

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
想法:因為是一個preorder 的序列,所以我們可以用一個 array 紀錄每一層上一個插入的節點
2+
接著,在字串中把每個數字提取出來,同時紀錄中間相隔了多少 '-' (代表這個數字要被插入的深度)
3+
只需將 array 中上一層的節點下新增子節點即可
4+
5+
Time Complexity : O(n) for traversing the string
6+
Space Complexity : O(h) = O(n) for the array to store the last insert node of each height
7+
8+
/**
9+
* Definition for a binary tree node.
10+
* struct TreeNode {
11+
* int val;
12+
* TreeNode *left;
13+
* TreeNode *right;
14+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
15+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
16+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
17+
* };
18+
*/
19+
class Solution {
20+
public:
21+
TreeNode* recoverFromPreorder(string traversal) {
22+
vector<TreeNode*> lastinserted ;
23+
int i = 0 ;
24+
int rootnumber = traversal[i] - '0' ;
25+
while ( i + 1 < traversal.length() && traversal[i + 1] != '-' ) {
26+
rootnumber *= 10 ;
27+
rootnumber += traversal[i + 1] - '0' ;
28+
i++ ;
29+
}
30+
31+
lastinserted.push_back( new TreeNode(rootnumber) ) ;
32+
33+
int height = 0;
34+
for(i = i + 1; i < traversal.length() ; i++) {
35+
if (traversal[i] != '-') {
36+
//cout << height << " " << i << endl ;
37+
int number = traversal[i] - '0' ;
38+
while ( i + 1 < traversal.length() &&traversal[i + 1] != '-' ) {
39+
number *= 10 ;
40+
number += traversal[i + 1] - '0' ;
41+
i++;
42+
}
43+
44+
45+
TreeNode* nownode = new TreeNode(number);
46+
if ( lastinserted[height - 1]->left == nullptr ) {
47+
lastinserted[height - 1]->left = nownode ;
48+
}
49+
else
50+
lastinserted[height - 1]->right = nownode ;
51+
52+
if ( height >= lastinserted.size() )
53+
lastinserted.push_back( nownode ) ;
54+
else
55+
lastinserted[height] = nownode ;
56+
height = 0 ;
57+
}
58+
else {
59+
height++ ;
60+
}
61+
62+
}
63+
return lastinserted[0];
64+
}
65+
};

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /