【发布时间】:2013-12-12 22:26:21
【问题描述】:
长期读者第一次发帖(主要是因为 99% 的问题已经在这里得到解答!!!)
我已经浏览了大约一个小时,但无法找到解决此问题的方法。给定一个预先排序的平衡二叉搜索树,我的任务是使以下方法更有效地找到树中的最大值:
private int max(IntTreeNode root) {
if (root.left == null && root.right == null)
return root.data;
else {
int maxValue = root.data;
if (root.left != null)
maxValue=Math.max(maxValue,max(root.left));
if (root.right != null)
maxValue = Math.max(maxValue,max(root.right));
return maxValue;
这是我的两个想法(可能其中一个是错误的,这就是问题所在):
1) 虽然它已排序和平衡,但它的大小可能会有所不同,因此我必须检查每一片叶子,因为该方法的唯一参数是根,我在那里看不到任何快捷方式。
2) 相同的原因,单个参数,意味着我必须使用行 maxValue=Math.max(maxValue,max(root.left));在每个递归调用中,以便在 maxValue 上保持一个运行数字。所以我看不出在哪里可以跳过那些无用的计算。
被问到的问题是,考虑到排序后的平衡 BST 信息,您如何使该方法更有效,其他信息正是我所在的位置。谢谢
编辑 我想我担心的是 11 元素树
1
/ \
2 3
/ \ / \
4 5 6 7
/ \/ \ / \ / \ (making a tree got real hard)
8 9 10 11 (this row is a little messed up but demonstrates the point)
如果你只选择正确的,你最终会在 7 点,因此是错误的。除非我对排序 BST 的含义感到困惑,否则 BST 是否总是必须在底行填满?
【问题讨论】:
-
由于树是排序的,最大值应该在最右边,所以不需要检查root.left。
-
你所描绘的只是一棵二叉树。二叉搜索树(BST)是二叉树的一种特殊情况。 en.wikipedia.org/wiki/Binary_search_tree
-
好吧,这至少是有道理的,ty Ajai!这种树就是我们得到的程序输出的内容,任务内容如下:“重写 min 和 max 方法,以便它们与二叉搜索树一起使用。将这些方法添加到我们在课堂时间处理的代码中。这些方法应利用树已排序的事实,除非必要,否则不应检查节点。”所以我不明白为什么分配与提供的源代码无关,哈哈,但是鉴于您的链接和信息,正确的唯一树选项非常有意义,适合所有人
标签: java recursion binary-search-tree