长时间阅读第一次海报(主要是因为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总是必须在最后一行填满?
答案 0 :(得分:2)
在BST中,最右边的元素是最大值。
这是伪代码。
int getMax(Node root) { //check if root is null
if(root.right == null) {
return root.data
} else {
return getMax(root.right)
}
}
对于平衡树,订单为O(log n)
。
答案 1 :(得分:0)
对于LHS它总是小于根,所以不需要搜索你可以使用这个:
private int max(IntTreeNode root) {
if ( root.right == null) // no need to search in LHS
return root.data;
else {
int maxValue = root.data;
maxValue = Math.max(maxValue,max(root.right));
}
return maxValue;
如果不是这样,你想再问我一下你想要的是这个方法的预期输出,我会尽力帮助你:)