计算二叉树中具有特定子项数的节点?

时间:2015-05-01 07:04:34

标签: c++ recursion binary-tree nodes children

我从一本关于c ++的书中得到了这个具有挑战性的练习,我不知道如何解决这个问题。 我必须定义一个名为treeNodeCount()的函数,它返回二叉树中的节点数(很简单),我还必须定义一个带有int(0,1或2)的重载函数,它表示子节点数,该函数应返回具有该特定子节点数的节点。 treeNodeCount都应该使用一个名为nodeCount(elemType root)的函数来进行计算节点所需的递归(基本上所有工作都是如此)。

挑战第一号说我可以向nodeCount添加第二个参数,该参数获取我们想要计算的节点的子节点数。

第二个挑战说我们不能使用第二个参数(这是一个艰难的部分)

我能够挑战一个,这就是我想出的:

template <class elemType>
int binaryTreeType<elemType>::nodeCount(nodeType<elemType> *p, int a ) const
{

    if (p == NULL){
        return 0;
    }

    else if (a == 0 && p->lLink == NULL && p->rLink == NULL){
        return 1 + nodeCount(p->lLink, a) + nodeCount(p->rLink, a);
    }
    else if (a == 1 && (p->lLink != NULL ^ p->rLink != NULL)){
        return 1 + nodeCount(p->lLink, a) + nodeCount(p->rLink, a);
    }
    else if (a == 2 && p->lLink != NULL && p->rLink != NULL){
        return 1 + nodeCount(p->lLink, a) + nodeCount(p->rLink, a);
    }

    else if (a == -1){
        return nodeCount(p->lLink, a) + nodeCount(p->rLink, a) + 1;

}
    return nodeCount(p->lLink, a) + nodeCount(p->rLink, a);
}

template <class elemType>
int binaryTreeType<elemType>::treeNodeCount(int a) const{
    return nodeCount(root, a);
}

这似乎工作正常,但我确信必须有更好的方法。 我无法做挑战2,我不知道该做什么(甚至可能)

1 个答案:

答案 0 :(得分:2)

通过实现一个返回给定节点的子节点数的函数,您可以缩小逻辑并使其更简单。

template <class elemType>
int nodeSize(nodeType<elemType>* node) const
{
    int count = 0;
    if (node->lLink)
        ++count;
    if (node->rLink)
        ++count;
    return count;
}

template <class elemType>
int binaryTreeType<elemType>::nodeCount(nodeType<elemType>* node, int count) const
{
    if (node)
    {
        if (nodeSize(node) == count || count == -1)
             return nodeCount(node->lLink, count) + nodeCount(node->rLink, count) + 1;
        return nodeCount(node->lLink, count) + nodeCount(node->rLink, count);
    }
    return 0;
}

对于第二个挑战,你需要一个堆栈来避免递归。

template <class elemType>
int binaryTreeType<elemType>::treeNodeCount(int count) const
{
    stack<nodeType<elemType>*> node_stack;
    node_stack.push(root);

    int num_matches = 0;
    while (!stack.empty())
    {
        nodeType<elemType>* node = node_stack.top();
        node_stack.pop();
        if (node)
        {
            if (nodeSize(node) == count || count == -1)
                ++num_matches;
            node_stack.push(node->lLink);
            node_stack.push(node->rLink);
        }
    }
    return num_matches;
}

编辑:在上面的递归版本中修复了一个goof。感谢David Rodriguez指出它。