Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 仅从前序或后序遍历计算BST的内部路径长度_Algorithm_Binary Search Tree - Fatal编程技术网

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

Algorithm 仅从前序或后序遍历计算BST的内部路径长度,algorithm,binary-search-tree,Algorithm,Binary Search Tree,大家好,我的社区 我试图弄清楚如何计算BST的内部路径长度,只给出前序或后序遍历(应该没有太大区别),而不构建树;也就是说,我只想使用上面提到的一种遍历。对你们大多数人来说,这可能是一个简单的答案,但你们可能已经认为我对树木很陌生了 好的,任何想法都很感激和感谢。如果我理解你的问题,这可能是不可能的。考虑两棵树 A A / \ | B C B | C 它们具有相同的前序遍历(ABC),

大家好,我的社区

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


好的,任何想法都很感激和感谢。

如果我理解你的问题,这可能是不可能的。考虑两棵树

   A         A
  / \        |
 B   C       B
             |
             C
它们具有相同的前序遍历(ABC),但不同的内部路径长度(2和3)。

有一页讨论如何从其前序遍历和按序遍历构建树。这里,因为您的树是一个搜索树,所以您可以隐式地进行顺序遍历(使用键的排序顺序)。您可以使用类似于该站点的递归算法来计算每个树节点的级别(无需构建树),然后将这些级别相加以获得内部路径长度。该算法可能不是最有效的,因为它会在遍历过程中进行搜索,以找到每个节点的正确子节点,但它应该可以工作。这是我对如何执行单遍算法的最佳猜测(假设所有键都不同):

首先:

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

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

由于它是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;
       }
  }
}
findIPLPreOrder(poArray、startIndex、endIndex、height){
if(startIndex==endIndex){
返回高度;
}
m=findIndexOfEndofLeftSubTree(poArray、start、end);
返回findIPLPreOrder(poArray,start+1,m,height+1)+findIPLPreOrder(poArray,m+1,end,height+1);
}
findIndexOfEndofLeftSubTree(poArray、start、end){
R=poArray[start]

对于(i=start+1;这可能是一个家庭作业问题吗?我很乐意帮你解决,但如果这是一门课,我不想只为你做作业。尽管+1是一个很酷的问题。:-)嘿,templatetypedef!谢谢你的回答。不,我在读有关树的文章,看到树已经构建好,你可以计算de ipl或epl。我想知道你可以对bst的遍历进行多少操作/计算。因此隐式地给出了它的顺序遍历。所以你将有一个唯一的树。
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;
       }
  }
}