在二叉树中查找“局部最小值”

时间:2013-03-27 10:40:49

标签: binary-tree local min

你们可以帮我解决一些我被困住的作业问题吗?

完整二叉树中的局部最小值被定义为小于其所有邻居(邻居=父,左子,右子)的节点。 我需要在给定的完整二叉树中找到一个局部最小值,它的每个节点都有不同的数字,在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”,但我们错过了它,因为在开始时我们决定搜索根的右子树。

3 个答案:

答案 0 :(得分:7)

根据定义,本地min是一个节点,其值小于连接到它的任何其他节点的值。因此,在您的示例中,' 1',' 5',' 6',' 2',' 7', ' 13'都是当地的最低要求。

一旦清楚,问题就很简单了。

首先我们检查根,看看它是否比两个孩子都小。如果是,那么我们就完成了。如果没有,那么我们拿起它的小孩并递归地应用支票。

我们终止1)我们发现一个小于其子节点的节点,或者2)我们到达底层(即叶子)。

在情况1)中,我们停止的节点是本地最小值,因为i)它比它的两个子节点小,并且ii)它比它的父节点小,这是我们决定检查这个节点的前提条件。

在情况2)中,我们留下了两个叶子(即兄弟姐妹),并且其中至少有一个小于父亲(否则将返回父亲)。然后,它们中的任何一个(或两个)都是局部最小值,只要它比它的父亲小。

遵循这种方法,每个级别最多只能查看2个节点,因此只需要进行O(log n)检查。

希望这有用且清晰。

答案 1 :(得分:1)

如果你想在O(logn)中找到一个,那么如果它没有孩子,则

“2”被认为是局部最小值。无法在O(logn)

中找到“1”

答案 2 :(得分:0)

我相信这可以在O(N)中完成。

从根开始。检查它的孩子是否小于孩子。如果有,去那个孩子。如果没有,我们就完成了。

然后,通过连续选择小于当前节点的子代来重复此过程。检查是否为当地分钟。如果没有,请重复。

这样做,我们保证当前节点的父节点始终大于其自身。如果算法停止,则只有两种情况:

  1. 当前节点是叶子。
  2. 当前节点的两个孩子都比它大。

在任何一种情况下,当前节点都是本地分钟。