二进制搜索树示例1,2,3,4,5,6,7

时间:2018-04-15 00:12:59

标签: key binary-tree binary-search-tree

  

将使用键1,2,3,4,5,6,7获得的二叉搜索树按给定的顺序插入到最初为空的树中。

这个二进制搜索树看起来像1是根节点,2看起来是正确的子树,2有3个右子树,等等,最多7个

  

你得到的树有什么问题?

任何节点都没有左子树。这不满足BST的属性(左子树中的所有对象都具有比节点本身更小的键,并且与右子树相同的键具有比节点本身更大的键)。

我只是想验证这就是造成这个问题的原因。

  

如何修改插入算法来解决此问题?

您可以使用AVL树通过交换必要的节点来平衡它。

我的问题是:这是正确的吗?

1 个答案:

答案 0 :(得分:0)

问题是您基本上有一个LinkedList。它仍然是二进制搜索树,但不是非常有用的树。但是,它确实满足二进制搜索树的属性。

  

您如何修改插入算法以解决此问题?

与其按给定的顺序插入,不如让您更聪明,然后尝试使用最小高度的二进制搜索树。这是Java的示例实现:

class App {
    public static void main(String[] args) {
        List<Integer> sorted = Arrays.asList(1, 2, 3, 4, 5, 6, 7);

        int mid = sorted.size() / 2;
        Node rootNode = new Node();
        rootNode.val = sorted.get(mid);

        addChildren(sorted.subList(0, mid), rootNode, true);
        addChildren(sorted.subList(mid + 1, sorted.size()), rootNode, false);

        System.out.println(rootNode);
    }

    static void addChildren(List<Integer> sorted, Node parent, boolean left) {
        if (sorted.isEmpty()) {
            return;
        }

        int mid = sorted.size() / 2;
        Node child = new Node();
        child.val = sorted.get(mid);

        if (left) {
            parent.left = child;
        } else {
            parent.right = child;
        }

        if (sorted.size() == 1) {
            return;
        }

        addChildren(sorted.subList(0, mid), child, true);
        addChildren(sorted.subList(mid + 1, sorted.size()), child, false);
    }
}

class Node {
    Integer val;
    Node left;
    Node right;
}

此算法生成的二叉树的高度为3而不是7

     4
   /   \
  2     6
 / \   / \ 
1  3  5   7

这将使您能够利用二进制搜索树的优势。