C ++递归二叉树

时间:2013-12-12 19:46:36

标签: c++ recursion binary-tree

我有这个find函数,它应该从我的树中返回一个值为val的节点,但它会丢失它要返回的节点,而是返回一个nullptr。这是为什么?

BinaryNode<int>* generalTree::find(int val, BinaryNode<int>* thisNode){
    if(thisNode->getItem()==val){
    return thisNode;
    }
    else{
        BinaryNode<int>* left=find(val, thisNode->getLeftChildPtr());
        BinaryNode<int>* right=find(val, thisNode->getRightChildPtr());
        if(left->getItem()==val){
            return left;
        }
        if(right->getItem()==val){  
            return right;
        }
    }    
}

最初使用 rootPtr 进行调用 thisNode

2 个答案:

答案 0 :(得分:1)

如果你看一下控制流程,基本问题就变得很明显了:

if (A)
    return X;
else if(B)
    return Y;
if (C)
    return Z;

现在,如果A,B或C都不为真,会发生什么?执行流程结束,而不返回任何。这导致了不确定的行为。

你编写代码的方式也是不必要的(毫无意义)效率低下。如果未找到所需元素作为根,则搜索两个子树。这基本上意味着它将基本上搜索整个树,试图找到项目,而不是利用排序来有效地找到项目。至少在正常情况下,您希望比较项目以查找要搜索的树,因此在搜索的任何给定点,您只搜索可以(或可能)包含您正在查找的数据的一个子树对

答案 1 :(得分:0)

该函数不正确,因为没有检查使用(或返回)节点是否为NULL。

我会按照以下方式编写函数

BinaryNode<int>* generalTree::find(int val, BinaryNode<int>* thisNode)
{
    if ( thisNode == nullptr || thisNode->getItem() == val ) return thisNode;


    if ( val < thisNode->getItem() ) return find( val, thisNode->getLeftChildPtr() );
    else return find( val, thisNode->getRightChildPtr() );
}