如何计算二进制搜索树中的比较?

时间:2017-11-02 12:14:19

标签: c++ node.js tree

我有一个二进制节点类,二叉树和二叉搜索树,它们包含基本的树函数,如查找节点,添加节点,删除节点,获取高度,获取节点数等等。我试图添加一个新函数来计算在树中找到某个特定节点的比较次数,但我已经把自己搞糊涂了。我能做的最好的事情是检查节点是否在树中,但我无法弄清楚如何在每次比较时使计数器增加。我试图做的方法很难转化为我现在的代码。我只是觉得我做得不对。如果有人可以帮我解决这个问题,我真的很感激。

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");
}

1 个答案:

答案 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会给你计数,希望这有帮助