我在C中编写了以下函数,如果元素确实在二叉树中,则返回1,否则返回0。
#!/bin/bash
dtree=$(find Downgrade -type f -iname device*)
ramdisk=$(find Downgrade -type f -name *.dmg)
kernel=$(find Downgrade -type f -iname kernel*)
./irecovery -s <<EOF
/send $dtree
devicetree
/send $ramdisk
ramdisk
/send $kernel
bootx
reboot
EOF
首先我输入函数以查看根是否存在,如果是,我查看该根的数据并将其与search_item进行比较。如果为真,我只返回1并退出,否则我继续预订遍历。为什么我总是得到0回报?即使该项目在二叉树中?
答案 0 :(得分:4)
更改这些行
isElementInBinaryTree(root -> left, search_item);
isElementInBinaryTree(root -> right, search_item);
返回结果。
即
return isElementInBinaryTree(root -> left, search_item) || isElementInBinaryTree(root -> right, search_item);
如果在LHS中找到该项,则返回true - 否则将尝试RHS。注意使用||
- 短路运算符
修改强>
可以将其转换为一个返回语句
int isElementInBinaryTree(BinaryTreeNode *root, int search_item)
{
return root ? (search_item == root -> data || isElementInBinaryTree(root -> left, search_item) || isElementInBinaryTree(root -> right, search_item)) : 0;
}
编辑2
假设您正在搜索用于订购树的项目,其中LHS小于且RHS大于。
代码看起来应该是
int isElementInBinaryTree(BinaryTreeNode *root, int search_item)
{
if(root) {
// Assuming that most of the items in the tree are not the search item
// best to check first if we need to search LHS or RHS - these
// events are more likely than the item being found!
if (search_item < root -> data) return isElementInBinaryTree(root -> left, search_item);
if (search_item > root -> data) return isElementInBinaryTree(root -> right, search_item);
return 1; // We have found it
}
return 0;
}
答案 1 :(得分:4)
您不能使用isElementInBinaryTree
递归调用的返回值。您必须将递归调用的结果传播到最顶层的调用。它现在的方式只有当目标项位于根节点时才会返回1。
所以:
int isElementInBinaryTree(BinaryTreeNode *root, int search_item)
{
if(root) {
if (search_item == root -> data) return 1;
if (isElementInBinaryTree(root -> left, search_item)) return 1;
if (isElementInBinaryTree(root -> right, search_item)) return 1;
}
return 0;
}
答案 2 :(得分:1)
您不仅需要从递归调用中返回值,还应该只递归到可能包含search_item
的树的部分。
因此假设树的排序方式是lower = left,那么你的函数看起来应该更像:
int isElementInBinaryTree(BinaryTreeNode *root, int search_item)
{
if(root) {
if (search_item == root -> data) return 1;
else if (search_item < root -> data) return isElementInBinaryTree(root -> left, search_item);
else if (search_item > root -> data) return isElementInBinaryTree(root -> right, search_item);
}
return 0;
}