使用c ++中的按顺序遍历在BST中的节点的等级

时间:2015-10-28 07:05:57

标签: c++ algorithm recursion binary-search-tree

我一直在追逐我的尾巴以找到BST中节点的等级。我有void函数接受一个元素并使用递归查找节点的等级 我按以下顺序插入节点: 12,3,7,4,11,17,15,9 。我的问题是,每当我找到匹配时,递归都不会停止!这是我的算法:

template <class Comparable>
void AugmentedBinarySearchTree<Comparable>::
Rank(const Comparable & x, BinaryNode<Comparable> *t, int *nodesVisited) const
{  

    // x is the element I am looking for
    // t is the root
    if (t->left != NULL)
    {

    Rank(x, t->left, nodesVisited);                         
    if(t->left->element == x)
        return; 
    }
    cout << "element " << t->element << ", x " << x << ", nodesVisited "<< *nodesVisited << endl;
    if (x == t->element) 
    {               

        cout << "found the node " << endl;
        return ; // exiting the recursion, nodesVisited will be the rank 
                // nodesVisited starts counting from 1
    }

    ++(*nodesVisited); // incrementing the count

    if (t->right != NULL)
    {       
        Rank(x, t->right, nodesVisited);    
    }
}

当我做Rank(3)时它起作用,但当我做Rank(4)时递归不会停止并且我得到不同的结果:

element 3, x 4, nodesVisited 1
element 4, x 4, nodesVisited 2
found the node 
element 12, x 4, nodesVisited 2
element 15, x 4, nodesVisited 3
element 17, x 4, nodesVisited 4
RANK: 5

每当找到匹配项时,如何停止递归?

1 个答案:

答案 0 :(得分:1)

如果在左子节点中找到该项,则终止递归  如果在左侧子树中找到它,则需要停止。

这样的事情可能会这样做(我修改它以返回等级,正如你所说的那样) 在我看来,使用&#34; null&#34;基本情况通常会导致更简单的树递归 (顺便说一句,彻底未经测试的代码。可能存在错误。)

int Rank(const Comparable & x, const BinaryNode<Comparable> *t) const
{
    int rank = 0;
    return FindRank(x, t, &rank) ? rank : -1;
}

// Returns 'true' if and only if the node was found in 't'.
bool FindRank(const Comparable & x, const BinaryNode<Comparable> *t, int* nodesVisited) const
{
    if (t == nullptr)
    {
        return false;
    }

    if (FindRank(x, t->left, nodesVisited))
    {
        return true;
    }

    *nodesVisited += 1;
    return t->element == x || FindRank(x, t->right, nodesVisited);
}