Problem#  Find distance from root to a given node in a binary tree.
Examples#  Example 1#  graph TD;
    A[3] --> B[5]
    A[3] --> C[1]
    B[5] --> D[6]
    B[5] --> E[2]
    C[1] --> F[0]
    C[1] --> G[8]
    E[2] --> H[7]
    E[2] --> I[4]
   1
 2
 3
 Input: root =  [ 3 , 5 , 1 , 6 , 2 , 0 , 8 , null , null , 7 , 4 ],  target =  4 
 Output: 3 
 Explanation: The path to node `4`  is  { 3  ->  5  ->  2  ->  4 },  which requires traversing 3  edges.  Hence,  the distance is  3. 
 
Example 2#  1
 2
 3
 nput: root =  [ 3 , 5 , 1 , 6 , 2 , 0 , 8 , null , null , 7 , 4 ],  target =  5 
 Output: 1 
 Explanation: The path to node `5`  is  { 3  ->  5 },  which requires traversing 1  edge.  Hence,  the distance is  1. ` 
 
Example 3#  1
 2
 3
 Input: root =  [ 3 , 5 , 1 , 6 , 2 , 0 , 8 , null , null , 7 , 4 ],  target =  3 
 Output: 0 
 Explanation: The distance between a node and itself is  0. 
 
Similar Problem#  [[Find path from root to given node in a binary tree]]
Solution#  Method 1 - DFS#  Reasoning or Intuition#  The distance represents the depth of the tree node from the root. Begin at the root node and follow its children recursively in a depth-first manner. Check whether the current node matches the target value. Maintain a counter to track the depth level during traversal. For the target node, return the corresponding depth. Approach#  Recursive Traversal :Implement a helper function for depth-first search (DFS). Each recursive call increments a “current depth” counter. If the target node is found, the depth counter is returned. If the target node doesn’t exist in the tree, return -1 (or user-defined value for non-existence). Base Cases :If the root is null, return -1. If the current node matches the target value, return the current depth. Code#  
Java
 
Python 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 class  Solution  {
    public  int  findDistance (TreeNode root, int  target) {
         return  findDepth(root, target, 0);
     }
 
     private  int  findDepth (TreeNode node, int  target, int  depth) {
         if  (node ==  null ) {
             return  - 1; // Target not found 
         }
         if  (node.val  ==  target) {
             return  depth; // Target found 
         }
 
         int  left =  findDepth(node.left , target, depth +  1);
         if  (left !=  - 1) {
             return  left;
         }
 
         int  right =  findDepth(node.right , target, depth +  1);
         return  right;
     }
 } 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 class  Solution :
    def  findDistance (self, root: TreeNode, target: int) ->  int:
         def  find_depth (node, target, depth):
             if  not  node:
                 return  - 1   # Target not found 
             if  node. val ==  target:
                 return  depth  # Target found 
             # Search left and right subtrees 
             left =  find_depth(node. left, target, depth +  1 )
             if  left !=  - 1 :
                 return  left
             right =  find_depth(node. right, target, depth +  1 )
             return  right
 
         return  find_depth(root, target, 0 ) 
Complexity#  ⏰ Time complexity: O(n). The algorithm traverses each node exactly once in the worst-case scenario. 🧺 Space complexity: O(h). The space requirement is proportional to the height of the tree due to the recursive call stack.