【问题标题】:Best algorithm to search Binary Search Tree (BST)搜索二叉搜索树 (BST) 的最佳算法
【发布时间】:2020-09-03 13:03:24
【问题描述】:

我有一个二叉搜索树,它的每个节点都有两个值。

int value;
String name;

所以它的节点是这样的。

class Node {
        int value;
        String name;
        Node left, right;
}

我已根据节点的“名称”变量的升序在 BST 中插入值。因此,树的顺序遍历将按“名称”的升序返回节点。

现在我想根据“值”变量的升序显示树节点。不改变原来的树。哪种算法/方法对此最有效?

【问题讨论】:

  • 您正在寻找的是一个常规的排序算法。树在这里没有提供任何帮助。
  • 所以我应该创建一个数组而不是树?
  • 实际上使用 BST 是我的任务的一部分。这就是为什么我不能使用任何其他数据结构。
  • 然后您需要使用新的比较器重新创建树以获得值。您当前带有名称比较器的树对您没有任何价值。
  • 这似乎是一个不错的方法。多谢兄弟。让我们看看其他人是否可以用更好的解决方案指导我。否则我会使用你的解决方案。

标签: java algorithm sorting data-structures binary-search-tree


【解决方案1】:

将 TreeSet 与比较器一起使用,该比较器根据名称升序排序并从左到右遍历节点,如下所示:

您可以使用recursion version

    public static Iterable<Node> order(Node root) {
        Comparator<Node> cmp = (node1, node2) -> node1.name.compareTo(node2.name);
        TreeSet<Node> set = new TreeSet<>(cmp);
        visit(set, root);
        return set;
    }

    public static void visit(TreeSet<Node> set, Node node) {
        if (node == null)
            return;
        set.add(node);
        visit(set, node.left);
        visit(set, node.right);
    }

,或Queue version

    public static Iterable<Node> order(Node root) {
        Comparator<Node> cmp = (node1, node2) -> node1.name.compareTo(node2.name);
        Queue<Node> queue = new ArrayDeque<>();
        TreeSet<Node> set = new TreeSet<>(cmp);
        queue.add(root);
        set.add(root);
        while (!queue.isEmpty()) {
            Node node = queue.poll();
            if (node.left != null) {
                queue.add(node.left);
                set.add(node.left);
            }

            if (node.right != null) {
                queue.add(node.right);
                set.add(root);
            }
        }
        return set;
    }

【讨论】:

    【解决方案2】:

    这应该可行:

    void addToTree(Node Tree, Node x){
        if (Tree.value < x.value){
            if (Tree.right == null){
                Tree.right = x
            } else {
                addToTree(Tree.right, x)
            }
        } else if (Tree.value > x.value) {
            if (Tree.left == null){
                Tree.left = x
            } else {
                addToTree(Tree.left, x)
            }
        } else {
            throw new Exception("Value already exists.")
        }
    }
    
    Node getFromTree(Node Tree, int x){
        if (Tree.value < x.value){
            if (Tree.right == null){
                throw new Exception("Value doesn't exist.")
            } else {
                return getFromTree(Tree.right, x)
            }
        } else if (Tree.value > x.value){
            if (Tree.left == null){
                throw new Exception("Value doesn't exist.")
            } else {
                return getFromTree(Tree.left, x)
            }
        } else {
            return Tree
        }
    }
    

    它根据节点的值(Node.value)对节点进行排序和查找。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2019-05-06
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多