Performing a BFS on all directions in a Binary Tree
I've tried this problem before pre-pandemic and failed to realize that it requires something not very common: to perform a BFS on a binary tree across all directions. The "across all directions" means that it is necessary to create the link node -> parent. This can be done using a simple DFS storing the info in a hash table. Then once you find the node related to K (another DFS), then perform a BFS going left, right, parent. All the code together should run in linear time, with a constant 3 (O(3N)). Code is below, cheers, ACC.
Closest Leaf in a Binary Tree - LeetCode
Given the root of a binary tree where every node has a unique value and a target integer k, return the value of the nearest leaf node to the target k in the tree.
Nearest to a leaf means the least number of edges traveled on the binary tree to reach any leaf of the tree. Also, a node is called a leaf if it has no children.
Example 1:

Input: root = [1,3,2], k = 1 Output: 2 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 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.
Constraints:
- The number of nodes in the tree is in the range
[1, 1000]. 1 <= Node.val <= 1000- All the values of the tree are unique.
- There exist some node in the tree where
Node.val == k.
public class QueueItem
{
public TreeNode node = null;
public int steps = 0;
public QueueItem(TreeNode node, int steps)
{
this.node = node;
this.steps = steps;
}
}
public class Solution
{
public int FindClosestLeaf(TreeNode root, int k)
{
Hashtable nodeParent = new Hashtable();
CreateTreeNodeParent(root, null, nodeParent);
TreeNode target = FindK(root, k);
//BFS
Queue queue = new Queue();
Hashtable visited = new Hashtable();
QueueItem qi = new QueueItem(target, 0);
queue.Enqueue(qi);
visited.Add(target.val, true);
int minDistance = Int32.MaxValue;
int minNodeVal = -1;
while (queue.Count > 0)
{
QueueItem currentQi = queue.Dequeue();
if (currentQi.node != null && currentQi.node.left == null && currentQi.node.right == null)
{
if (currentQi.steps < minDistance)
{
minDistance = currentQi.steps;
minNodeVal = currentQi.node.val;
}
}
//Children:
if (currentQi.node.left != null && !visited.ContainsKey(currentQi.node.left.val))
{
QueueItem leftQueueItem = new QueueItem(currentQi.node.left, currentQi.steps + 1);
queue.Enqueue(leftQueueItem);
visited.Add(currentQi.node.left.val, true);
}
if (currentQi.node.right != null && !visited.ContainsKey(currentQi.node.right.val))
{
QueueItem rightQueueItem = new QueueItem(currentQi.node.right, currentQi.steps + 1);
queue.Enqueue(rightQueueItem);
visited.Add(currentQi.node.right.val, true);
}
//Parent:
TreeNode parent = (TreeNode)nodeParent[currentQi.node.val];
if (parent != null && !visited.ContainsKey(parent.val))
{
QueueItem parentQueueItem = new QueueItem(parent, currentQi.steps + 1);
queue.Enqueue(parentQueueItem);
visited.Add(parent.val, true);
}
}
return minNodeVal;
}
public TreeNode FindK(TreeNode node, int k)
{
if (node != null)
{
if (node.val == k) return node;
TreeNode left = FindK(node.left, k);
if (left != null) return left;
TreeNode right = FindK(node.right, k);
return right;
}
else
{
return null;
}
}
public void CreateTreeNodeParent(TreeNode node, TreeNode parent, Hashtable nodeParent)
{
if (node != null)
{
nodeParent.Add(node.val, parent);
CreateTreeNodeParent(node.left, node, nodeParent);
CreateTreeNodeParent(node.right, node, nodeParent);
}
}
}
Comments
Post a Comment