这是我的代码:
template <typename DataType> bool SearchValue(TreeNode<DataType> *root, DataType search_value)
{
if(search_value != root->data)
{
if(root->right != NULL)
{
return SearchValue(root->right, search_value);
}
if (root->left != NULL)
{
return SearchValue(root->left, search_value);
}
return false;
}
else
{
return true;
}
}
我无法使SearchValue
功能正常工作。条件不是更改SearchValue
函数的签名。
问题如下:例如,我们尝试找到数据字段等于“90”的元素,它存在于树中。有时这段代码会找到这个元素,有时候不会 - 取决于它在树中的位置。
问题是如何使它每次都正常工作。
我以这种方式构建树:
template <typename DataType> TreeNode<DataType> *BuildTree()
{
TreeNode<DataType> *root = new TreeNode<DataType>(10, new TreeNode<DataType>(20), new TreeNode<DataType>(30));
TreeNode<DataType> *curRoot = root;
curRoot = curRoot->left;
curRoot->left = new TreeNode<DataType>(40);
curRoot->left->left = new TreeNode<DataType>(70);
curRoot->right = new TreeNode<DataType>(50);
curRoot = curRoot->right;
curRoot->left = new TreeNode<DataType>(80, new TreeNode<DataType>(100), new TreeNode<DataType>(110));
curRoot = root->right;
curRoot->left = new TreeNode<DataType>(60);
curRoot = curRoot->left;
curRoot->right = new TreeNode<DataType>(90, new TreeNode<DataType>(120), new TreeNode<DataType>(130));
return root;
}
我用这种方式测试搜索:
TreeNode<int> *treeRoot = BuildTree<int>();
int valueToFind = treeRoot->data;
cout << "Enter the value you'd like to find in the tree: ";
cin >> valueToFind;
cin.get();
if(SearchValue(treeRoot, valueToFind) == true)
{
cout << "Value " << valueToFind << " was found!";
}
我实现树的方式:
template <typename DataType> struct TreeNode
{
TreeNode(DataType val, TreeNode<DataType> *leftPtr = NULL, TreeNode<DataType> *rightPtr = NULL)
{
left = leftPtr;
right = rightPtr;
data = val;
}
TreeNode<DataType> *left, *right;
DataType data;
};
答案 0 :(得分:5)
当前搜索将始终跟随右分支(如果存在)(然后从不跟随左分支)。如果数据在树中排序(这是典型的),代码应检查根节点以决定是向左还是向右遍历。
答案 1 :(得分:1)
更改
if(root->right != NULL)
{
return SearchValue(root->right, search_value);
}
if (root->left != NULL)
{
return SearchValue(root->left, search_value);
}
return false;
到
if(root->right != NULL)
{
if (SearchValue(root->right, search_value))
return true;
}
if (root->left != NULL)
{
if (SearchValue(root->left, search_value))
return true;
}
return false;
你现在拥有它的方式,它总是沿着正确的分支向下返回,如果在那里找到它,则永远不会检查左分支。
答案 2 :(得分:0)
您可以清楚地告诉代码是错误的,因为您从未执行过比较。因此,默认情况下,代码不正确。
您需要进行比较以确定哪个分支发生故障,而不仅仅是测试是否存在。
答案 3 :(得分:0)
就像彼得亚历山大所说,你不能在右分支上返回,唯一的返回条件是相等的并且返回true,对于其他条件,需要继续左分支。