【问题标题】:Creating Binary Search Trees创建二叉搜索树
【发布时间】:2012-05-11 11:15:28
【问题描述】:

如果我构造一个二叉搜索树,按顺序添加以下值:

 10, 7, 16, 12, 5, 11, 2, 20, 1, 14

我得到一棵高度为 5 的树。有没有一种方法(除了反复试验)可以用来确定整数的顺序,从而创建高度为 4 的树?

【问题讨论】:

标签: algorithm binary-tree binary-search


【解决方案1】:

我还没有完全考虑过这一点,但是获得特定深度树的一种方法是在插入元素之前对其进行排序:即排序然后将 N 元素插入二叉搜索树将产生深度树N.

您可能能够:

  1. 对元素进行排序
  2. 插入其中的特定K=4 以生成深度树K
  3. 插入其余元素,使树不会变得更深。

(当然,选择从哪些K 元素开始以及插入剩余元素的策略是棘手的部分——但也许这是一个开始?)


编辑:我认为通用解决方案是可能的,假设K 足够大。这个怎么样:

  1. 给定10, 7, 16, 12, 5, 11, 2, 20, 1, 14
  2. 对元素进行排序:1, 2, 5, 7, 10, 11, 12, 14, 16, 20
  3. 插入最后一个 K=4 元素,然后是最后一个 K-1,然后是 K-2,依此类推,一直到 1。

例如排序插入最后4个后:

12
  \
   14
     \
      16
        \
         20

...然后在插入最后 3 个之后:

  12
 /  \
7    14
 \     \
  10    16
    \     \
     11    20

...然后在最后 2 个之后:

    12
   /  \
  7    14
 / \     \
2   10    16
 \    \     \
  5    11    20

...最后,在插入最后一个元素之后:

      12
     /  \
    7    14
   / \     \
  2   10    16
 / \    \     \
1   5    11    20

...剩下的 BST 高度为 K=4。

请注意,这种方法仅在K 足够大时才有效——特别是在K(K+1)/2 >= N 时。

【讨论】:

  • 二叉树中的 18 是从哪里得到的?
  • @Chibox:对不起,错字。现在应该修好了。
  • 我不认为您的方法适用于所有情况。假设我们有一棵数字为 1-7 的树。如果我们使用您的方法,我们插入 5,6,7,然后是 3,4,然后是 2,然后是 1。最终结果是一棵高度为 4 的树,其中 5 作为根节点。但是,如果我们使用 4 作为根节点,则可以将 7 个节点排列为高度为 3 的完美平衡二叉树。
  • @missingno: 是的,这种方法只有在K 足够大时才有效。我已经更新了答案。
  • @NateKohl:不,你的方法总会有一个反例。我给出的完美填充 tre 具有 2^h - 1 个元素的示例也扩展到所有 h。我们知道只有一种方法可以让这棵密集树保持平衡,为了做到这一点,您需要较大的一半元素包括根节点和(密集打包的)右子树。如果你按照你建议的顺序插入它们,你最终只会有一个脊椎,这还不够。
【解决方案2】:

是的,您可以首先构建一个完美平衡的树,然后您可以输出节点,使其父节点在其子节点之前打印。

要创建完美平衡的树,只需对数字进行排序,然后使用递归二分法来构建树。


例如,在您的情况下,我们将对数字进行排序

 1 2 5 7 10 11 12 14 16 20

然后从它们中构建一个平衡树(以中间数为根,递归地重复这个过程)

            11
     5            14
 1     7       12    16
   2     10             20

我们现在可以使用前序遍历或广度优先遍历以您想要的顺序打印节点(只要我们在子节点之前输出父节点就可以了)。

11 5 14 1 7 12 16 2 10 20

【讨论】:

    【解决方案3】:
    public void testMakeBinarySearchTree() {
        List<Integer> array = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            array.add(i+1);
        }
    
    
        Collections.shuffle(array);
    
    
        Node root = new Node(array.get(5));
        for (int value : array) {
            binarySearchTreeInsertNode(root, value);
        }
    }
    
    
    private void binarySearchTreeInsertNode(Node node, int value) {
        int data = node.getData();
        if ( value > data) {
            Node right = node.getRight();
            if (right != null) {
                binarySearchTreeInsertNode(right, value);
            } else {
                node.setRight(new Node(value));
            }
        } else if (value < data) {
            Node left = node.getLeft();
            if (left != null) {
                binarySearchTreeInsertNode(left, value);
            } else {
                node.setLeft(new Node(value));
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多