如何在BST中返回具有特定值的节点?

时间:2016-10-10 17:09:41

标签: java recursion binary-search-tree

我必须做一个所谓的"命中平衡树"。不同之处在于,您可以看到,我的节点类有一个名为numberOfHits的实例变量,只要您调用包含方法或 findNode 方法,该变量就会递增。这个练习的目的是让顶部有最高命中数的节点,因此树基本上重建(或旋转)。 Root的命中率明显最高。

我有一个关于我必须制作的方法的问题,它返回命中次数最多的节点。我后来需要它让树自己旋转(我猜,至少那个计划)。这是我的节点类。 (当然所有的吸气剂)

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;
}

这很好,除了它返回一个整数。我需要返回节点本身。因为我必须递归地执行此操作,所以我决定找到最大的命中数,然后在另一个返回节点的方法中使用此方法,就像这样(它可能效率非常低,所以如果你有改进的提示,我在听):

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

1 个答案:

答案 0 :(得分: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;
}

让我知道如果有任何问题,这是我的头脑,但我认为指出&#34;整数&#34;您的方法的版本应该只使用&#34;节点查找&#34;该方法的版本。您编写的用于查找最大的方法与我在此处编写的用于查找最大节点的方法非常相似。