我有一个二进制节点类,二叉树和二叉搜索树,它们包含基本的树函数,如查找节点,添加节点,删除节点,获取高度,获取节点数等等。我试图添加一个新函数来计算在树中找到某个特定节点的比较次数,但我已经把自己搞糊涂了。我能做的最好的事情是检查节点是否在树中,但我无法弄清楚如何在每次比较时使计数器增加。我试图做的方法很难转化为我现在的代码。我只是觉得我做得不对。如果有人可以帮我解决这个问题,我真的很感激。
int counter = 0;
template<class ItemType>
ItemType BinarySearchTree<ItemType>::IsInTree(BinaryNode<ItemType>*
BinTreePtr, const ItemType& item)
{
BinaryNode<ItemType>* tmp = BinTreePtr;
counter++;
if (tmp == NULL) {
printf("Number of comparisons: \n", counter);
return 1;
}
else {
counter++;
if (&tmp->getItem == item)
{
printf("Number of comparisons: \n", counter);
return 0;
}
else {
counter++;
if (item < &tmp->g)
return IsInTree(tmp->leftChildPtr, item);
else
return IsIntree(tmp->rightChildPtr, item);
}
}
}
int main(){
BinarySearchTree<string>* tree1Ptr = new BinarySearchTree<string>();
tree1Ptr->add("10");
tree1Ptr->add("20");
tree1Ptr->add("30");
tree1Ptr->add("40");
tree1Ptr->add("50");
tree1Ptr->add("60");
tree1Ptr->add("70");
tree1Ptr->add("80");
counter = 0;
tree1Ptr->IsInTree(tree1Ptr, "10");
}
答案 0 :(得分:2)
将计数器值初始化为1并在条件内的每次比较之前将计数器增加到if语句
if (tmp == NULL) {
printf("Number of comparisons: \n", counter-1);
return 1;
}
else {
if (counter++ && &tmp->getItem == item)
{
printf("Number of comparisons: \n", counter-1);
return 0;
}
else {
if (counter++ && item < &tmp->g)
return IsInTree(tmp->leftChildPtr, item);
else
return IsIntree(tmp->rightChildPtr, item);
}
}
counter-1会给你计数,希望这有帮助