-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBurn tree
70 lines (67 loc) · 2.17 KB
/
Burn tree
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
class Solution {
public:
Node* createParentMapping(Node* root, int target, map<Node*,Node*> &nodeToParent){
Node* res = NULL;
queue<Node*> q;
q.push(root);
nodeToParent[root] = NULL;
while(!q.empty()){
Node* frontNode = q.front();
q.pop();
if(frontNode->data == target){
res = frontNode;
}
if(frontNode->left){
nodeToParent[frontNode->left] = frontNode;
q.push(frontNode->left);
}
if(frontNode->right){
nodeToParent[frontNode->right] = frontNode;
q.push(frontNode->right);
}
}
return res;
}
int burnTree(Node* root, map<Node*,Node*> &nodeToParent){
map<Node*, bool> visited;
queue<Node*> q;
q.push(root);
visited[root] = true;
int ans = 0;
while(!q.empty()){
bool flag = false;
int size = q.size();
for(int i=0;i<size;i++){
//process the neighboring node
Node* frontNode = q.front();
q.pop();
if(frontNode->left && !visited[frontNode->left]){
flag = true;
q.push(frontNode->left);
visited[frontNode->left] = true;
}
if(frontNode->right && !visited[frontNode->right]){
flag = true;
q.push(frontNode->right);
visited[frontNode->right] = true;
}
if(nodeToParent[frontNode] && !visited[nodeToParent[frontNode]]){
flag = true;
q.push(nodeToParent[frontNode]);
visited[nodeToParent[frontNode]] = true;
}
}
if(flag == 1){
ans++;
}
}
return ans;
}
int minTime(Node* root, int target)
{
map<Node*,Node*> nodeToParent;
Node* targetNode = createParentMapping(root,target,nodeToParent);
int ans = burnTree(targetNode,nodeToParent);
return ans;
}
};