我需要返回O(1)
中二进制搜索树中不存在的节点值。树的节点值来自(1,2...M)
。
提示是使用二叉搜索树并在每个节点中保存3个字段,这对我有帮助。
我的想法是在根目录中创建一个包含所有可能值的字段,来自(1..M)
,每次我们插入具有特定值的节点时,我们检查根中的额外字段并删除它,如果它存在。
最后返回一个树中不存在的值,我们所要做的就是在root中输入该字段并返回其中的任何值。
有什么想法吗?我是对的吗?
答案 0 :(得分:3)
考虑每个节点包含以下三个数据字段:
左/右值形成节点值周围后代节点的“非间隙”值范围的边界。要查找 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)是一个集合本身。