在二叉树中搜索元素时,函数始终返回0

时间:2016-04-01 18:30:26

标签: c binary-tree

我在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回报?即使该项目在二叉树中?

3 个答案:

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