LeetCode 742. Closest Leaf in a Binary Tree

原题链接在这里:https://leetcode.com/problems/closest-leaf-in-a-binary-tree/

题目:

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:

  1. root represents a binary tree with at least 1 node and at most 1000 nodes.
  2. Every node has a unique node.val in range [1, 1000].
  3. There exists some node in the given binary tree for which node.val == k.

题解:

First do DFS, find the TreeNode whose value is k, mark as kNode. At the same time, update HashMap with child->parent relationship.

Then do BFS from kNode, if any of left child, right child and parent is not null, put it into the queue. The first met leaf node is the nearest leaf node to kNode.

Time Complexity: O(n).

Space: O(n).

AC Java:

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public int findClosestLeaf(TreeNode root, int k) {
12         if(root == null){
13             return -1;
14         }
15         
16         HashMap<TreeNode, TreeNode> hm = new HashMap<TreeNode, TreeNode>();
17         TreeNode kNode = dfs(root, k, hm);
18         
19         LinkedList<TreeNode> que = new LinkedList<TreeNode>();
20         HashSet<TreeNode> visited = new HashSet<TreeNode>();
21         que.add(kNode);
22         visited.add(kNode);
23         
24         while(!que.isEmpty()){
25             TreeNode cur = que.poll();
26             if(cur.left == null && cur.right == null){
27                 return cur.val;
28             }
29             
30             if(cur.left != null && !visited.contains(cur.left)){
31                 que.add(cur.left);
32                 visited.add(cur.left);
33             }
34             
35             if(cur.right != null && !visited.contains(cur.right)){
36                 que.add(cur.right);
37                 visited.add(cur.right);
38             }
39             
40             if(hm.containsKey(cur) && !visited.contains(hm.get(cur))){
41                 que.add(hm.get(cur));
42                 visited.add(hm.get(cur));
43             }
44         }
45         
46         return -1;
47     }
48     
49     private TreeNode dfs(TreeNode root, int k, HashMap<TreeNode, TreeNode> hm){        
50         if(root.val == k){
51             return root;
52         }
53         
54         if(root.left != null){
55             hm.put(root.left, root);
56             TreeNode left = dfs(root.left, k, hm);
57             if(left != null){
58                 return left;
59             }
60         }
61         
62         if(root.right != null){
63             hm.put(root.right, root);
64             TreeNode right = dfs(root.right, k, hm);
65             if(right != null){
66                 return right;
67             }
68         }
69         
70         return null;
71     }
72 }

 

转载于:https://www.cnblogs.com/Dylan-Java-NYC/p/11008908.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值