尽管值为

时间:2016-03-29 19:58:31

标签: c

typedef struct BinaryTreeNode {
int data;
BinaryTreeNode * left;
BinaryTreeNode * right;
} BinaryTreeNode;

int isElementInBinaryTree(BinaryTreeNode *root, int search_item) {
    if(root) {
        if(search_item == root -> data) return 1;
        isElementInBinaryTree(root -> left, search_item);
        isElementInBinaryTree(root -> right, search_item);
    }
}

int main() {
    BinaryTreeNode one = {1, NULL, NULL}; // root of the binary tree
    BinaryTreeNode two = {2, NULL, NULL};
    BinaryTreeNode three = {3, NULL, NULL};
    BinaryTreeNode four = {4, NULL, NULL};
    BinaryTreeNode five = {5, NULL, NULL};
    BinaryTreeNode six = {6, NULL, NULL};
    BinaryTreeNode seven = {7, NULL, NULL};

    one.left = &two;
    one.right = &three;

    two.left = &four;
    two.right = &five;

    three.left = &six;
    three.right = &seven;

    printf("%d ", isElementInBinaryTree(&one, 4));
    printf("\n");

    return 0;
}

我正在编写一个名为isElementInBinaryTree的函数,它返回1(true)是元素存在,否则为0。我不明白为什么函数总是返回0,尽管二叉树中存在数字4?

2 个答案:

答案 0 :(得分:3)

您的代码在递归时实际上并没有返回任何内容,因此“返回值”通常是用于此目的的寄存器中遗留的任何内容。

此代码

if(root) {
        if(search_item == root -> data) return 1;
        isElementInBinaryTree(root -> left, search_item);
        isElementInBinaryTree(root -> right, search_item);
    }

需要看起来更像这样

if(root) 
{
    if(search_item == root -> data) return 1;

    if (isElementInBinaryTree(root -> left, search_item)) return 1;
    return isElementInBinaryTree(root -> right, search_item);
}
return 0;

最后return 0;确保在提供NULL指针时返回合理的内容。

编译代码时,它应该显示有关在没有return语句的情况下终止的类型化函数的警告。你需要注意那些警告并解决它们。

整个事情实际上可以简化为单一(虽然不太清晰)代码行

return root && ((search_item == root->data) ||
                isElementInBinaryTree(root->left, search_item) ||
                isElementInBinaryTree(root->right, search_item));

依赖于快捷方式评估,只能根据需要进行。

答案 1 :(得分:2)

执行递归调用时,您没有返回任何内容。因此,如果在树的根部找到该项,它将仅返回1

此外,当你到达树的底部而没有找到任何东西时,你不返回任何东西,这需要返回0来指示失败。

int isElementInBinaryTree(BinaryTreeNode *root, int search_item) {
    if(root) {
        if(search_item == root -> data) {
            return 1;
        }
        return isElementInBinaryTree(root -> left, search_item) || 
               isElementInBinaryTree(root -> right, search_item);
    } else {
        return 0;
    }
}