Skip to content

Commit f52e2c0

Browse files
authored
Create clone-n-ary-tree.cpp
1 parent e447f6d commit f52e2c0

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

C++/clone-n-ary-tree.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Time: O(n)
2+
// Space: O(h)
3+
4+
class Solution {
5+
public:
6+
Node* cloneTree(Node* root) {
7+
using RET = Node*;
8+
RET result{};
9+
vector<tuple<int, RET, shared_ptr<RET>, RET *>> stk = {{1, root, nullptr, &result}};
10+
while (!stk.empty()) {
11+
const auto [step, node, ret1, ret] = stk.back(); stk.pop_back();
12+
if (step == 1) {
13+
if (!node) {
14+
continue;
15+
}
16+
*ret = new Node(node->val);
17+
for (int i = node->children.size() - 1; i >= 0; --i) {
18+
const auto& ret1 = make_shared<RET>();
19+
stk.emplace_back(2, nullptr, ret1, ret);
20+
stk.emplace_back(1, node->children[i], nullptr, ret1.get());
21+
}
22+
} else {
23+
(*ret)->children.emplace_back(*ret1);
24+
}
25+
}
26+
return result;
27+
}
28+
};
29+
30+
// Time: O(n)
31+
// Space: O(h)
32+
class Solution2 {
33+
public:
34+
Node* cloneTree(Node* root) {
35+
return dfs(root);
36+
}
37+
38+
private:
39+
Node *dfs(Node *node) {
40+
if (!node) {
41+
return nullptr;
42+
}
43+
auto copy = new Node(node->val);
44+
for (const auto& child : node->children) {
45+
copy->children.emplace_back(dfs(child));
46+
}
47+
return copy;
48+
}
49+
};

0 commit comments

Comments
 (0)