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.
Solutions
Solution 1: DFS + BFS
Thinking
Find the nearest leaf to the node valued \(k\). The leaf may sit in the subtree or require walking up to the parent first. Downward search alone misses that.
On the undirected graph of the tree, the first leaf reached by BFS from \(k\) is the closest. Values are unique, so the start is easy to find.
DFS records parent/child edges both ways, then BFS from \(k\) returns on the first node with no children. \(O(n)\).
First, we use depth-first search to construct an undirected graph \(g\), where \(g[node]\) represents the set of nodes adjacent to the node \(node\). Then we start a breadth-first search from node \(k\) until we find a leaf node, which is the answer.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Where \(n\) is the number of nodes in the binary tree.
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funcfindClosestLeaf(root*TreeNode,kint)int{g:=map[*TreeNode][]*TreeNode{}vardfsfunc(*TreeNode,*TreeNode)dfs=func(root,fa*TreeNode){ifroot!=nil{g[root]=append(g[root],fa)g[fa]=append(g[fa],root)dfs(root.Left,root)dfs(root.Right,root)}}dfs(root,nil)q:=[]*TreeNode{}vis:=map[*TreeNode]bool{}fornode:=rangeg{ifnode!=nil&&node.Val==k{q=append(q,node)vis[node]=truebreak}}for{node:=q[0]q=q[1:]ifnode!=nil{ifnode.Left==node.Right{returnnode.Val}for_,nxt:=rangeg[node]{if!vis[nxt]{vis[nxt]=trueq=append(q,nxt)}}}}}