Given a binary tree where every node has a unique value, and a target key k
, find the value of the nearest leaf node to target k
in the tree.
Here, nearest to a leaf means the least number of edges travelled on the binary tree to reach any leaf of the tree. Also, a node is called a leaf if it has no children.
In the following examples, the input tree is represented in flattened form row by row. The actual root
tree given will be a TreeNode object.
Example 1:
Input: root = [1, 3, 2], k = 1 Diagram of binary tree: 1 / \ 3 2 Output: 2 (or 3) Explanation: Either 2 or 3 is the nearest leaf node to the target of 1.
Example 2:
Input: root = [1], k = 1 Output: 1 Explanation: The nearest leaf node is the root node itself.
Example 3:
Input: root = [1,2,3,4,null,null,null,5,null,6], k = 2 Diagram of binary tree: 1 / \ 2 3 / 4 / 5 / 6 Output: 3 Explanation: The leaf node with value 3 (and not the leaf node with value 6) is nearest to the node with value 2.
Note:
root
represents a binary tree with at least1
node and at most1000
nodes.- Every node has a unique
node.val
in range[1, 1000]
. - There exists some node in the given binary tree for which
node.val == k
.
class Solution {
public:
int findClosestLeaf(TreeNode* root, int k) {
kv=k;
for(int i=0;i<1010;i++)
{
f[i]=false;
v[i]=false;
}
helper(root);
queue<int> q;
q.push(k);
int res=0;
while(q.size()>0)
{
int tk=q.front();
if(f[tk] == true)
return tk;
q.pop();
if( v[tk] == false)
{
v[tk]=true;
res++;
int ns=n[tk].size();
for(int i=0;i<ns;i++)
{
int tki=n[tk][i];
if(f[tki] == true)
return tki;
if(v[tki] == false)
{
q.push(tki);
}
}
}
}
return -1;
}
void helper(TreeNode* t)
{
if(t == NULL)
return;
if(t->left == NULL && t->right == NULL)
{
f[t->val]=true;
return;
}
if(t->left !=NULL)
{
n[t->left->val].push_back(t->val);
n[t->val].push_back(t->left->val);
helper(t->left);
}
if(t->right !=NULL)
{
n[t->right->val].push_back(t->val);
n[t->val].push_back(t->right->val);
helper(t->right);
}
}
private:
vector<int> n[1010];
bool f[1010];
bool v[1010];
int kv;
};