二进制搜索树搜索故障排除

时间:2018-11-26 14:55:11

标签: java search binary-search-tree

我花了大约两天时间,不知道有什么丢失。最初,我的 BST 使用可比对象,然后在它不起作用时将其切换为int以简化它。

我在树上添加了几项,它成功地按顺序打印了它们。然后,当我第一次调用 search()方法时,它会按原样返回true。之后的所有其他搜索调用,无论是true还是false都返回false。

如果问题与搜索方法本身无关,我将在其中包含大部分代码。

输出应为:4 12 23 27 30 42 60 84 true true false true true

但我却得到:4 12 23 27 30 42 60 84 true false false false false

public class BSTree {

    TreeNode root;
    static int comparison;

    public void insert(int value) {
        if (root == null) {
            root = new TreeNode(value);
        }
        else {
            root.insert(value);
        }
    }

    public boolean search(int chicken) {
        if (root != null ) {
            return root.search(chicken);
        }

        return false;
    }
    public static int height(TreeNode b) {
        return TreeNode.height(b);
    }

    public static void CompareSet() {
         comparison++;
    }

    public int getCompare() {
        return comparison;
    }

    public void ResetCompare() {
        comparison = 0;
    }

    public static void traverseInOrder (TreeNode node) {
        if (node != null) {
            traverseInOrder(node.left);
            System.out.print(" " + node.data);
            traverseInOrder (node.right);
        }
    }

    public static void main(String args[]) {
        BSTree tree = new BSTree();

        tree.insert(30);
        tree.insert(42);
        tree.insert(84);
        tree.insert(12);
        tree.insert(4);
        tree.insert(23);
        tree.insert(27);
        tree.insert(60);

        traverseInOrder(tree.root);
        System.out.println("\n" + tree.search(30));
        System.out.println("\n" + tree.search(4));
        System.out.println("" + tree.search(50));
        System.out.println("" + tree.search(27));
        System.out.println("" + tree.search(42));
        System.out.println(height(tree.root));

    }
}

这是 treeNode 类:

public class TreeNode<T> {

    int data;
    TreeNode left;
    TreeNode right;


    TreeNode(int value){
        this.data = value;
        //right = null;
        //left = null;
    }

    public void insert(int value) {
        if (value == data) {
            return;
        }

        if (value < data) {
            if (left == null) {
                left = new TreeNode(value);
            }
            else {
                left.insert(value);
            }
        }
        else {
            if (right == null) {
                right = new TreeNode(value);
        }
        else {
            right.insert(value);
        }
    }

    public boolean search(int value) {

        BSTree.CompareSet();

        if (data == value) return true;

        if (data < value && left!=null)
            return left.search(value);
        else if(data > value && right != null) 
            return right.search(value);
        return false;   
    }

    public static int height(TreeNode b) {
        if (b == null) return -1;
        return 1 + Math.max(height(b.left), height(b.right));
    }

    public int getData(){
        return data;
    }
    public TreeNode getLeftChild() {
        return left;
    }

    public void setLeftChild(TreeNode leftChild) {
        this.left = leftChild;
    }

    public TreeNode getRightChild() {
        return right;
    }

    public void setRightChild(TreeNode rightChild) {
        this.right = rightChild;
    }   
}

2 个答案:

答案 0 :(得分:0)

您的比较相反:)))这是经过纠正的TreeNode :: search方法:

public boolean search(int value) {

    BSTree.CompareSet();

    if (data == value) return true;

    if (data > value && left!=null)
        return left.search(value);
    else if(data < value && right != null) 
        return right.search(value);
    return false;   
}

我认为您交换了datavalue变量。

答案 1 :(得分:0)

只需将您的TreeNode类的 search 方法更改为此:

public boolean search(int value) {

    Test.CompareSet();

    if (data == value) return true;

    if (data < value && right!=null)
        return right.search(value);
    else if(data > value && left != null) 
        return left.search(value);
    return false;   
}

当当前节点的数据大于值时,您需要转到左子树。当当前节点的数据小于值时,您需要转到正确的子树。您只需完成相反的操作即可。