V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hakunamatata11
V2EX  ›  推广

[简单] Google 面试题:二叉搜索树中最接近的值

  •  
  •   hakunamatata11 · 2020-09-03 18:48:41 +08:00 · 844 次点击
    这是一个创建于 1545 天前的主题,其中的信息可能已经有所发展或是发生改变。

    给一棵非空二叉搜索树以及一个 target 值,找到在 BST 中最接近给定值的节点值

    • 给出的目标值为浮点数
    • 我们可以保证只有唯一一个最接近给定值的节点

    做题地址

    样例 1

    输入: root = {5,4,9,2,#,8,10} and target = 6.124780
    输出: 5
    解释:
    二叉树 {5,4,9,2,#,8,10},表示如下的树结构:
            5
           / \
         4    9
        /    / \
       2    8  10
    
    

    样例 2

    输入: root = {3,2,4,1} and target = 4.142857
    输出: 4
    解释:
    二叉树 {3,2,4,1},表示如下的树结构:
         3
        / \
      2    4
     /
    1
    
    

    [题解]

    算法很简单,求出 lowerBound 和 upperBound 。即 < target 的最大值和 >= target 的最小值。

    然后在两者之中去比较谁更接近,然后返回即可。

    时间复杂度为 O(h),注意如果你使用 in-order traversal 的话,时间复杂度会是 o(n) 并不是最优的。另外复杂度也不是 O(logn) 因为 BST 并不保证树高是 logn 的。

    class Solution {
        public int closestValue(TreeNode root, double target) {
            if (root == null) {
                return 0;
            }
    
            TreeNode lowerNode = lowerBound(root, target);
            TreeNode upperNode = upperBound(root, target);
    
            if (lowerNode == null) {
                return upperNode.val;
            }
    
            if (upperNode == null) {
                return lowerNode.val;
            }
    
            if (target - lowerNode.val > upperNode.val - target) {
                return upperNode.val;
            }
    
            return lowerNode.val;
        }
    
        // find the node with the largest value that smaller than target
        private TreeNode lowerBound(TreeNode root, double target) {
            if (root == null) {
                return null;
            }
    
            if (target <= root.val) {
                return lowerBound(root.left, target);
            }
    
            // root.val < target
            TreeNode lowerNode = lowerBound(root.right, target);
            if (lowerNode != null) {
                return lowerNode;
            }
    
            return root;
        }
    
        // find the node with the smallest value that larger than or equal to target
        private TreeNode upperBound(TreeNode root, double target) {
            if (root == null) {
                return null;
            }
    
            if (root.val < target) {
                return upperBound(root.right, target);
            }
    
            // root.val >= target
            TreeNode upperNode = upperBound(root.left, target);
            if (upperNode != null) {
                return upperNode;
            }
    
            return root;
        }
    
    }
    
    

    点此查看更多题解


    九章算法班 2020 版》扩充 5 倍课时

    课程亮点:

    • 疫情应对版九章算法班 2020 版》,令狐冲老师扩容 5 倍课程量

    • 8 周内讲解 57 个面试核心高频考点

    • 课程内容由 9 章节增加至 43 章

    • 7 天视频回放,戳我查看最新课程大纲!

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3837 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:30 · PVG 18:30 · LAX 02:30 · JFK 05:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.