-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path21_Find_Elementsin_a_Contaminated_Binary_Tree.cpp
140 lines (113 loc) · 3.87 KB
/
21_Find_Elementsin_a_Contaminated_Binary_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
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
// 1261. Find Elements in a Contaminated Binary Tree
// Given a binary tree with the following rules:
// root.val == 0
// For any treeNode:
// If treeNode.val has a value x and treeNode.left != null, then treeNode.left.val == 2 * x + 1
// If treeNode.val has a value x and treeNode.right != null, then treeNode.right.val == 2 * x + 2
// Now the binary tree is contaminated, which means all treeNode.val have been changed to -1.
// Implement the FindElements class:
// FindElements(TreeNode* root) Initializes the object with a contaminated binary tree and recovers it.
// bool find(int target) Returns true if the target value exists in the recovered binary tree.
// Example 1:
// Input
// ["FindElements","find","find"]
// [[[-1,null,-1]],[1],[2]]
// Output
// [null,false,true]
// Explanation
// FindElements findElements = new FindElements([-1,null,-1]);
// findElements.find(1); // return False
// findElements.find(2); // return True
// Example 2:
// Input
// ["FindElements","find","find","find"]
// [[[-1,-1,-1,-1,-1]],[1],[3],[5]]
// Output
// [null,true,true,false]
// Explanation
// FindElements findElements = new FindElements([-1,-1,-1,-1,-1]);
// findElements.find(1); // return True
// findElements.find(3); // return True
// findElements.find(5); // return False
// Example 3:
// Input
// ["FindElements","find","find","find","find"]
// [[[-1,null,-1,-1,null,-1]],[2],[3],[4],[5]]
// Output
// [null,true,false,false,true]
// Explanation
// FindElements findElements = new FindElements([-1,null,-1,-1,null,-1]);
// findElements.find(2); // return True
// findElements.find(3); // return False
// findElements.find(4); // return False
// findElements.find(5); // return True
// Constraints:
// TreeNode.val == -1
// The height of the binary tree is less than or equal to 20
// The total number of nodes is between [1, 104]
// Total calls of find() is between [1, 104]
// 0 <= target <= 106
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class FindElements
{
unordered_set<int> recoveredValues;
void recoverTree(TreeNode *root)
{
if (!root)
return;
recoveredValues.insert(root->val);
if (root->left)
{
root->left->val = 2 * root->val + 1;
recoverTree(root->left);
}
if (root->right)
{
root->right->val = 2 * root->val + 2;
recoverTree(root->right);
}
}
public:
FindElements(TreeNode *root)
{
root->val = 0;
recoverTree(root);
}
bool find(int target)
{
return recoveredValues.count(target);
}
};
/**
* Your FindElements object will be instantiated and called as such:
* FindElements* obj = new FindElements(root);
* bool param_1 = obj->find(target);
*/
/*
This code implements a solution for recovering and searching values in a contaminated binary tree. Here's how it works:
1. The class uses an unordered_set to store recovered values from the tree.
2. The recoverTree method:
- Recursively traverses the tree
- For each node, calculates its children's values using formulas:
- Left child = 2 * parent_value + 1
- Right child = 2 * parent_value + 2
- Stores each recovered value in the set
3. The constructor:
- Takes a contaminated tree (all nodes have value -1)
- Sets root value to 0
- Calls recoverTree to recover the entire tree
4. The find method:
- Checks if a target value exists in the recovered tree
- Uses the set's count method to return true if found, false otherwise
The solution has O(n) space complexity for storing values and O(1) time complexity for searching.
*/