【问题标题】:Returning node value that does not exist in binary tree in O(1)返回 O(1) 中二叉树中不存在的节点值
【发布时间】:2014-07-14 05:16:54
【问题描述】:

我需要返回节点值,它在O(1) 的二叉搜索树中不存在。树的节点值来自(1,2...M)

提示是使用二叉搜索树并在每个节点中保存 3 个字段,这将对我有所帮助。

我的想法是在根目录中创建一个包含所有可能值的字段,从(1..M) 开始,每次我们插入具有特定值的节点时,我们都会检查根目录中的额外字段,如果存在则将其删除。

最后返回树中不存在的值,我们要做的就是在根中输入该字段并返回其中的任何值。

有什么想法吗?我说的对吗?

【问题讨论】:

  • 为什么会被标记为 [java] 和 [c]?
  • @user2864740 不是一个特定的值,只是为了从 [1..M] 返回一个在二叉搜索树中不存在的随机值

标签: data-structures binary-tree big-o binary-search-tree


【解决方案1】:

考虑每个节点包含这三个数据字段:

  • value:节点本身的值
  • left:在该节点left的连续范围内的最小
  • 右:最大值在该节点的连续范围内

左/右值形成围绕节点值的后代节点的“非间隙”值范围的边界。要查找 a 缺失值,请选择这些最终值之一,然后选择适当的相邻(即 +/-1)值。

每当插入或删除子节点时,所有祖先的左/右都需要更新 - 这不会改变插入/删除复杂性界限,也不是“查找”的一部分-缺失”操作。 “查找缺失”操作本身的复杂度为 O(1),因为只需要考虑根节点的左/右(以及所有值的范围)。

考虑这棵树:

     +--- 4 ---+
     |         |
+--- 3         6 ---+
|                   |
1                   7

现在,开始从叶子中添加 L<..>R 值;很简单,叶节点的范围超过一个值。

       +--- 4 ---+
       |         |
  +--- 3         6 ---+
  |                   |
1<1>1               7<7>7

并添加到祖先..

       +--- 4 ---+
       |         |
  +- 3<3>3     5<6>7 -+
  |                   |
1<1>1               7<7>7

并添加到祖先..

       +- 3<4>4 -+
       |         |
  +- 3<3>3     6<6>7 -+
  |                   |
1<1>1               7<7>7

然后通过查看根节点可知 [3, 4] 是 descendant 节点中包含节点值的连续值范围。因此,两个缺失值是 2 (3-1) 或 5 (4+1)。

现在,添加一个节点..

       +- 3<4>7 -+
       |         |
  +- 3<3>3  +- 5<6>7 -+
  |         |         |
1<1>1     5<5>5     7<7>7

.. 已知两个缺失值是 2 和 8 ..

       +----- 1<4>7 -----+
       |                 |
  +- 1<2>3 -+       +- 5<6>7 -+
  |         |       |         |
1<1>1     3<3>3   5<5>5     7<7>7

.. 现在是 0(可能超出范围)和 8.


使用“根中包含所有可能值的字段”的方法听起来像使用单独的 Set 数据结构,这可能会错过给出提示的赋值目标。此外,考虑二叉树 (without duplicate values) Set 本身。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2020-08-25
    • 2011-08-21
    • 2012-12-11
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多