你们能帮我解决一些我遇到的家庭作业问题吗?
完整二叉树中的局部最小值定义为小于其所有邻居(邻居=父,左孩子,右孩子)的节点。我需要在给定的完整二叉树中找到一个局部最小值,它的每个节点都有不同的数字,在 O(logn) 复杂度时间内。
好吧,因为要求是 O(logn),所以我试图想出一种方法,只通过 1 条路径穿过树到达叶子。或者,也许我每次只能在递归中查看树的一半,这样它就会执行 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”,但我们错过了它,因为一开始我们决定搜索根的右子树。