你们可以帮我解决一些我被困住的作业问题吗?
完整二叉树中的局部最小值被定义为小于其所有邻居(邻居=父,左子,右子)的节点。 我需要在给定的完整二叉树中找到一个局部最小值,它的每个节点都有不同的数字,在O(logn)complixity时间内。
好吧,既然要求是O(logn),那么我试着想办法只通过一条路穿过树到一片叶子。 或者也许每次在递归中我只能查看树的一半,这样它就会进行登录。
所以说我在树上有这个:
70
/ \
77 60
有3例:
1)根小于左右儿童//然后我就完成了
2)根比左边小
3)根比右边小
上面的树是案例2。 所以让我们“扔掉”左边的子树,因为77不可能是“局部最小值”,因为它比它的父节点大。 所以我们留下了正确的子树。依此类推,直到找到当地的最低标准。
问题在于,当我们抛出左子树时,我们可能会错过下面的另一个本地最小值。这是一个例子:
70
/ \
77 60
/ \ / \
1 8 9 14
/ \ / \ / \ / \
3 4 5 6 2 7 15 13
所以在这种情况下,唯一的局部最小值是“1”,但我们错过了它,因为在开始时我们决定搜索根的右子树。
答案 0 :(得分:7)
根据定义,本地min是一个节点,其值小于连接到它的任何其他节点的值。因此,在您的示例中,' 1',' 5',' 6',' 2',' 7', ' 13'都是当地的最低要求。
一旦清楚,问题就很简单了。
首先我们检查根,看看它是否比两个孩子都小。如果是,那么我们就完成了。如果没有,那么我们拿起它的小孩并递归地应用支票。
我们终止1)我们发现一个小于其子节点的节点,或者2)我们到达底层(即叶子)。
在情况1)中,我们停止的节点是本地最小值,因为i)它比它的两个子节点小,并且ii)它比它的父节点小,这是我们决定检查这个节点的前提条件。
在情况2)中,我们留下了两个叶子(即兄弟姐妹),并且其中至少有一个小于父亲(否则将返回父亲)。然后,它们中的任何一个(或两个)都是局部最小值,只要它比它的父亲小。
遵循这种方法,每个级别最多只能查看2个节点,因此只需要进行O(log n)检查。
希望这有用且清晰。
答案 1 :(得分:1)
“2”被认为是局部最小值。无法在O(logn)
中找到“1”答案 2 :(得分:0)
我相信这可以在O(N)中完成。
从根开始。检查它的孩子是否小于孩子。如果有,去那个孩子。如果没有,我们就完成了。
然后,通过连续选择小于当前节点的子代来重复此过程。检查是否为当地分钟。如果没有,请重复。
这样做,我们保证当前节点的父节点始终大于其自身。如果算法停止,则只有两种情况:
在任何一种情况下,当前节点都是本地分钟。