从大型集合构建AVL树的高效算法

时间:2009-08-18 17:14:24

标签: algorithm avl-tree

我有一个很大的AVL Tree,我在程序期间从未排序的集合中构建了一些(它将用于稍后插入/删除项目)。

有没有比在每个项目上使用简单插入更好的算法?首先对集合进行排序然后尝试以不同方式构建它会更有效吗?

我的应用程序的分析告诉我这个AVL大楼是一个热点位置。

1 个答案:

答案 0 :(得分:1)

如果数据很方便地放入内存中,我的确希望先做一个快速排序,然后从中构建树比进行所有常规插入要快。

要从数组构建树,以递归方式操作,将树分为三个部分:中间元素,左侧部分和右侧部分;两个部分必须具有相同的大小(+ -1),然后从这些部分中形成树。这保证了生成的树几乎是平衡的(如果元素的数量是2 ^ n-1,它将完美平衡)。树创建应该返回树的高度,以便您可以方便地将余额放入每个节点。

编辑:假设Ian Piumarta的tree.h,我相信这个算法可以解决问题:

Node* tree_build(int key[], int value[], int L, int R) // L and R inclusive
{

  int M;
  Node *middle;
  int lh, rh;

  if(L == R)
    return Node_new(key[L], value[L]);

  if(L+1 == R) {
    Node *left = Node_new(key[L], value[L]);
    Node *right = Node_new(key[R], value[R]);
    left->tree.avl_right = right;
    left->tree.avl_height = 1;
    return left;
  }

  // more than two nodes
  M = L + (R-L)/2;
  middle = Node_new(key[M], value[M]);
  middle->tree.avl_left = tree_build(key, value, L, M-1);
  middle->tree.avl_right = tree_build(key, value, M+1, R);
  lh = middle->tree.avl_left->tree.avl_height;
  rh = middle->tree.avl_right->tree.avl_height;
  middle->tree.avl_height = 1 + (lh > rh ? lh:rh);
  return middle;
}