Hello StackOverflow社区!
我试图找出如何计算BST的内部路径长度,只给出前序或后序遍历(它应该没有多大区别)而不构造树;也就是说,我只想使用上面提到的一个遍历。对于大多数人来说,这可能是一个简单的答案,但正如你可能已经认为我对树木很新。
任何想法都表示赞赏和感谢。
答案 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)。