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?
答案 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;
}
}