Java BST最有效地搜索最大值

时间:2013-12-12 13:02:53

标签: java recursion binary-search-tree

长时间阅读第一次海报(主要是因为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总是必须在最后一行填满?

2 个答案:

答案 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;

如果不是这样,你想再问我一下你想要的是这个方法的预期输出,我会尽力帮助你:)