2016-10-10 124 views
0

我必须制作一个所谓的“命中平衡树”。不同之处在于,您可以看到,我的节点类有一个名为numberOfHits的实例变量,您可以随时调用包含方法或findNode方法的增量。这个练习的要点是让顶部的命中数最高的节点,所以树基本上重建自己(或旋转)。根具有最高的命中数。如何返回BST中具有特定值的节点?

我有一个关于我必须做出的方法的问题,它返回具有最高命中数的节点。我稍后需要它来让树自动旋转(我猜,至少这是该计划)。这是我的节点类。 (当然所有的干将)

public class HBTNode<T> { 


private HBTNode<T> left; 
private HBTNode<T> right; 
private T element; 
private int numberOfHits; 


public HBTNode(T element){ 
    this.left = null; 
    this.right = null; 
    this.element = element; 
    this.numberOfHits = 0; 
} 

我到目前为止是这样的:

public int findMaxCount(HBTNode<T> node) { 

    int max = node.getNumberOfHits(); 
    if (node.getLeft() != null) { 
     max = Math.max(max, findMaxCount(node.getLeft())); 
    } 
    if (node.getRight() != null) { 
     max = Math.max(max, findMaxCount(node.getRight())); 
    } 
    return max; 
} 

这工作得很好,但它返回一个integer.I需要返回的节点本身。因为我必须递归地做这件事,所以我决定找到最大的命中数,然后在另一个返回节点的方法中使用这个方法,就像这样(它可能真的效率很低,所以如果你有改进的提示,我正在听) :

public int findMaxCount() { 
    return findMaxCount(root); 
} 


public HBTNode<T> findMaxCountNode(HBTNode<T> node) { 

    if (node.getNumberOfHits() == this.findMaxCount()) { 
     return node; 
    } 

    if (node.getLeft() != null) { 
     return findMaxCountNode(node.getLeft()); 
    } 
    if (node.getRight() != null) { 
     return findMaxCountNode(node.getRight()); 
    } 

    return null; 
} 

我把这样的方法:

public HBTNode<T> findMaxCountNode() { 
    return findMaxCountNode(root); 
} 

它返回null,即使我想应该没事的,我不是擅长递归所以很明显,我失去了一些东西。如果您有任何关于我的这个练习,我愿意接受任何帮助,也有新的建议。非常感谢。

测试代码:

public static void main(String[] args) { 


    HBTree<Integer> tree = new HBTree<Integer>(); 

    tree.add(50); 
    tree.add(25); 
    tree.add(74); 
    tree.add(19); 
    tree.add(8); 
    tree.add(6); 
    tree.add(57); 
    tree.add(108); 


    System.out.println(tree.contains(108)); //contains method increases the count by one 
    System.out.println(tree.contains(8)); 
    System.out.println(tree.contains(8)); 
    System.out.println(tree.contains(108)); 
    System.out.println(tree.contains(8)); 
    System.out.println(tree.contains(108)); 
    System.out.println(tree.contains(108)); 
    System.out.println(tree.contains(108)); 

    System.out.println(tree.findMaxCountNode()); 

} 

电流输出:true true true true true true true true null

预期输出:true true true true true true true true Element: 108 Left child: 6 //this is just a toString, doesn't matter at this point Right child: null Number of hits: 5

+0

欢迎来到StackOverflow。请阅读并遵守帮助文档中的发布准则。 [最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)适用于此处。在您发布代码并准确描述问题之前,我们无法有效帮助您。具体而言,显示问题的测试用例在哪里,可能还有一些跟踪输出?我们应该看到来自调试尝试的输出,即使只有少数策略性地放置** print语句。 – Prune

+0

感谢您的耐心,我会编辑它并发布输出。 – d3nls

回答

0

好像你的两个函数看起来应该像下面这样。什么我假设这里要说的是这些功能,这是本HBTNode类中定义的,旨在找到下面最高触及数节点本身:

public HBTNode<T> findMaxCountNode(HBTNode<T> node) { 
    return findMaxCountNode(node, node); 
} 

public HBTNode<T> findMaxCountNode(HBTNode<T> node, HBTNode<T> maxNode) { 

    HBTNode<T> currMax = (node.getNumberOfHits() > maxNode.getNumberOfHits()) ? node : maxNode; 

    if (node.getLeft() != null) { 
     currMax = findMaxCountNode(node.getLeft(), currMax); 
    } 

    if (node.getRight() != null) { 
     currMax = findMaxCountNode(node.getRight(), currMax); 
    } 

    return currMax; 
} 

public int findMaxCount(HBTNode<T> node) { 
    HBTNode<T> maxNode = findMaxCountNode(node); 
    if (maxNode != NULL) 
     return maxNode.getNumberOfHits(); 
    else 
     return -1; 
} 

让我知道,如果有任何问题,这是我的头顶,但我认为指出你的方法的“整数”版本应该只使用该方法的“节点查找”版本会很有帮助。你写的找到最大值的方法与我在这里写的找到最大值节点非常相似。

+1

是的,它的工作原理。我的一位朋友实际上有相同的解决方案,除了方法的第一行是if(....)。出于原因,我完全没有想到同一个概念。我仍然想知道为什么我的这个解决方案是错误的。关键是要找到hitcount最高的节点,所以我们知道哪个节点最经常搜索。现在我必须以某种方式根据最高的hitcount节点轮换树,该节点自动应该成为根节点,谢谢回复。 – d3nls

+0

@ d3nls如果你不喜欢忙碌的工作,请随时提出另一个问题:)尽管如此,这是一个很好的学习经验。 –

+0

我理解它为什么可行,它是如何工作的,我的问题在于递归思考和生成更复杂的递归算法,而迭代不会让我头疼。尽管感谢您的帮助! – d3nls

相关问题