仅从预订或后序遍历计算BST的内部路径长度

时间:2011-02-23 05:01:05

标签: algorithm binary-search-tree

Hello StackOverflow社区!

我试图找出如何计算BST的内部路径长度,只给出前序或后序遍历(它应该没有多大区别)而不构造树;也就是说,我只想使用上面提到的一个遍历。对于大多数人来说,这可能是一个简单的答案,但正如你可能已经认为我对树木很新。

任何想法都表示赞赏和感谢。

3 个答案:

答案 0 :(得分:0)

http://geeksforgeeks.org/?p=6633处有一个页面,讨论如何从预订和按顺序遍历构建树。这里,由于您的树是搜索树,因此您可以隐式地使用有序遍历(使用键的排序顺序)。您可以使用类似于该站点的递归算法来计算每个树节点的级别(无需构建树),然后将这些级别一起添加以获取内部路径长度。该算法可能不是最有效的,因为它会在遍历上搜索以找到每个节点的正确子节点,但它应该有效。这是我对如何进行单遍算法的最佳猜测(假设所有键都是不同的):

int internal_path_length(key_iter& cur_node, key_iter end, int level, key max_key) {
  if (cur_node == end) return 0;
  key cur_key = *cur_node;
  if (cur_key > max_key) return 0;
  ++cur_node;
  int len1 = internal_path_length(cur_node, end, level + 1, cur_key);
  int len2 = internal_path_length(cur_node, end, level + 1, max_key);
  return len1 + len2 + level;
}

开始于:

key_iter i = preorder.begin();
internal_path_length(i, preorder.end(), 0, mk);

其中mk大于树中最大的可能键。

答案 1 :(得分:0)

由于它是BST,我们隐含地遍历树(元素的排序列表)。

我们可以通过预订或后序遍历创建一个独特的树 Pre将是[R,元素列表少于R,元素列表大于R] Post将是[元素列表少于R,元素列表大于R,R]

伪代码看起来像这样。

findIPLPreOrder(poArray,startIndex,endIndex, height) {
     if(startIndex==endIndex){
          retrn height;
     }
     m=findIndexOfEndofLeftSubTree(poArray,start,end);
     return findIPLPreOrder(poArray,start+1,m,height + 1) + findIPLPreOrder(poArray,m+1,end,height + 1);     
}

findIndexOfEndofLeftSubTree(poArray,start,end){
  R=poArray[start]
  for(i=start+1;i<=end;i++){
     if(R < poArray[i]){
         return i-1;
       }
  }
}

答案 2 :(得分:-1)

如果我理解你的问题,可能无法做到。考虑两棵树

   A         A
  / \        |
 B   C       B
             |
             C

它们具有相同的前序遍历(ABC)但内部路径长度不同(2和3)。