返回O(1)中二叉树中不存在的节点值

时间:2014-05-25 07:31:16

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

  • 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]是后代节点中包含节点值的连续值范围。因此,两个缺失值为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一个集合本身。