【发布时间】:2013-09-28 01:10:48
【问题描述】:
我有这个问题需要解决。我不是在寻找答案,而是在寻找我应该去哪里的提示。我有一个算法,但不是 O(log n)。
给定二叉树 T 和一个不大于 T 中节点数的正整数 k,编写识别 T 中的元素 v 的伪代码,使得 T 中的 k-1 个元素恰好小于 v。你的代码应该花费时间最多与 T 的高度。
我这里的基本想法是我会首先检查左树,检查左树的大小。如果左树的大小大于 k-1,则继续向左搜索。否则我会搜索正确的。如果整个左树不包含具有 k-1 个元素的节点,那么我搜索右子树。问题是我知道这不是 O(log n),因为最坏的情况是我必须搜索树中的每个节点。
我有什么遗漏吗?任何提示或帮助都会很棒,但请不要只给我答案。
【问题讨论】:
-
仔细查看您拥有的树结构,以及它附带的保证。如果不遍历子树,你知道它有多大吗?左子树中的所有内容是否都小于或等于当前节点的值?价值观是否不同?你知道一些关于子树的高度而不探索它们吗? “T的高度”实际上与“log n”成正比吗?
-
我应该提到每个节点都包含一个元素大小,即以该节点为根的节点数。所以我可以通过查看它的 size 元素来知道一个子树有多大。并且左侧树中的所有内容都将小于当前节点的值。大小值并不总是不同的。可以有多个大小为 k-1 的节点。据我在课堂上学到的知识,树的高度总是与 log n 成正比。
-
在节点v向右移动时,需要将搜索值调整为
k - (1 + size of left child tree of v)。除此之外,您可以在 O(tree height) 中进行下降,因为您可以使用该大小计数器在每个节点上做出正确的决定。 -
您能详细说明一下吗?我还是不明白。我仍然觉得它需要回到树上并检查右子树是否有左树大小为 k-1 的元素。假设我一直沿着左子树向下工作,检查每个左子树,直到到达空链接。我不应该检查右子树是否有左子树为 k-1 的元素吗?
标签: algorithm binary-tree binary-search-tree