zoukankan      html  css  js  c++  java
  • 742. 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.

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    [思维问题]:

    不知道还要找点,把路径存在hashmap

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    [一句话思路]:

    bfs的过程中,cur节点的左、右、map中存储的路径都要放进q

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. dfs函数的作用是返回有效的 值为k的节点,所以结果是左右节点的时候也需要返回
    2. 左右节点均为空的时候,再返回root.val的数值

    [二刷]:

    1. dfs函数中,先把左节点放进去,再返回整个的left

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    用map存路径map.put(root.left, root);,然后用dfs找到k

    [复杂度]:Time complexity: O(n) Space complexity: O(n)

    [算法思想:迭代/递归/分治/贪心]:

    [关键模板化代码]:

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

     [是否头一次写此类driver funcion的代码] :

     [潜台词] :

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public int findClosestLeaf(TreeNode root, int k) {
            //corner case
            if (root == null) return -1;
            
            //initialiazation: map, q
            //put first node into q, add left, right, route
            HashMap<TreeNode, TreeNode> map = new HashMap<TreeNode, TreeNode>();
            PriorityQueue<TreeNode> q = new PriorityQueue<TreeNode>();
            TreeNode match = dfsTree(k, root, map);
            
            q.add(match);
            while (!q.isEmpty()) {
                TreeNode cur = q.poll();
                if (cur.left == null && cur.right == null) return cur.val;
                if (cur.left != null) q.add(cur.left);
                if (cur.right != null) q.add(cur.right);
                if (map.containsKey(cur)) {
                    q.add(map.get(cur));
                    map.remove(cur);
                }
            }
            
            return -1;
        }
        
        public TreeNode dfsTree(int k, TreeNode root, Map<TreeNode, TreeNode> map) {
            //corner case : null
            if (root == null) return null;
            
            //return if left & right is null
            if (root.val == k) return root; 
            
            //put left into map and return left
            if (root.left != null) {
                map.put(root.left, root);
                TreeNode left = dfsTree(k, root.left, map);
                if (left != null) return left;
            } 
            
            //put left into map and return left
            if (root.right != null) {
                map.put(root.right, root);
                TreeNode right = dfsTree(k, root.right, map);
                if (right != null) return right;
            }
            
            //return null
            return null;
        }
    }
    View Code
  • 相关阅读:
    [转]Git忽略规则及.gitignore规则不生效的解决办法
    动漫(杂)
    《计算机图形学》2.5 ~ 2.7 学习笔记
    《计算机图形学》2.4 输入设备 学习笔记
    《计算机图形学》2.2.2 光栅扫描显示处理器
    Android 使用版本控制工具时添加忽略文件方式
    devexpress表格控件gridcontrol设置隔行变色、焦点行颜色、设置(改变)显示值、固定列不移动(附源码)
    详解shape标签
    以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程
    C#组件系列——又一款Excel处理神器Spire.XLS,你值得拥有
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9595478.html
Copyright © 2011-2022 走看看