比较器不适用于二叉树

问题描述 投票:0回答:1

我有这个东西

Comparator.java

public interface Comparator<T> {
    public int compareTo(int num);
}

valueComparator.java

public class valueComparator implements Comparator<Tree.Node> {
    @Override
    public int compareTo(Tree.Node obj, int number) {
        if (obj.getDataNumber() == number) {
            return 0;
        }
        else if (obj.getDataNumber() < number) {
            return -1;
        }
        else return 1;
    }
}

Tree.java

public class Tree {
    public Node root;

    Tree() {
    }

    public static class Node {

        Node(int number, String str, boolean flag) {
            dataNumber = number;
            dataText = str;
            dataBool = flag;
        }

        public int getDataNumber() {
            return this.dataNumber;
        }

        public String getDataText() {
            return this.dataText;
        }

        public boolean getDataBool() {
            return this.dataBool;
        }

        public void setDataText(String text) {
            this.dataText = text;
        }

        public void isDataBool(boolean flag) {
            this.dataBool = flag;
        }

        Node left;
        Node right;
        private int dataNumber;
        private String dataText;
        private boolean dataBool;

    }

    public void binaryTree() {
        root = null;
    }

    public boolean search(int number) {
        return search(root, number);
    }

    valueComparator comp = new valueComparator();

    private boolean search(Node node, int number) {
        if (node == null) {
            return false;
        }
        if (comp.compareTo(node, number) == 0) {
            return true;
        }
        if (comp.compareTo(node, number) == -1) {
            return search(node.left, number);
        }
        else {
            return search(node.right, number);
        }
    }  

    public void insertLeaf(int number, String str, boolean flag) {
    root = insertLeaf(root, number, str, flag);
    }
    private Node insertLeaf(Node node, int number, String str, boolean flag) {
        if (node == null) {
            node = new Node(number, str, flag);
        } else {
            if (number < node.dataNumber) {
                node.left = insertLeaf(node.left, number, str, flag);
            }
            else if (number > node.dataNumber) {
                node.right = insertLeaf(node.right, number, str, flag);
            }
            else {
                System.out.println("The element is already in the tree.");
            }
        }
        return node;
    }
}

Test.java

public class Test {
    public static void main(String args[]) {

        Tree binTree = new Tree();
        binTree.binaryTree();
        binTree.insertLeaf(5, "text2", true);
        binTree.insertLeaf(4, "text4", false);
        binTree.insertLeaf(1, "text1", true);
        binTree.insertLeaf(3, "text3", true);
        binTree.insertLeaf(2, "text5", false);
        System.out.println("Element 3 found: " + binTree.search(3));
    // Element 3 found: false
    }
}

我应该使用比较器进行搜索,但是我无法理解其逻辑。 compareTo方法适用于其自身,但卡在了递归搜索中。第一次通过后,如果compareTo的返回值不等于0,则它以null进入并退出递归并返回false。这意味着如果我将树的第一个元素设置为'3',则search(3)将返回true,但是如果它与3不同,则返回false-甚至不在树中寻找它。

java recursion binary-tree comparator
1个回答
1
投票

当您插入一个数字时,会将其直接与节点的值进行比较,如果该数字小于当前节点中存储的值,则遵循left指针。

但是,当您search输入数字时,您将使用比较器,该比较器将节点的值与给定的数字进行比较(请注意相反的顺序!),如果该数字小于当前节点中的值,则您可以跟随right链接。

根据需要使用直接比较或比较器–但在各处使用相同的方法。

© www.soinside.com 2019 - 2024. All rights reserved.