【发布时间】:2020-12-14 11:26:20
【问题描述】:
如何编写符合这些要求的代码? 这是问题: 检查树 T 中是否存在键为 K 的节点,如果有,则返回对该节点的引用。 如果树为空,则报告未找到该节点并停止。 否则,将 K 与根节点 X 的键值进行比较。
- 如果 K=X,则发出指向此节点的链接并停止。
- 如果 K>X,递归搜索 T 的右子树中的键 K。
- 如果 K
这是我发现的:
public GenBT<T> Find(GenBT<T> k, T inf){
if (k == null) return null;
else
switch (inf.CompareTo(k.inf)){
case 1: return Find(k.RT, inf);
case -1: return Find(k.LT, inf);
case 0: return k;
default: return null;}
};
但我也发现,如果我想在 BST 中搜索或查找,我必须使用这样的代码:
struct node* search(int data){
struct node *current = root;
printf("Visiting elements: ");
while(current->data != data){
if(current != NULL) {
printf("%d ",current->data);
//go to left tree
if(current->data > data){
current = current->leftChild;
} //else go to right tree
else {
current = current->rightChild;
}
//not found
if(current == NULL){
return NULL;
}
}
}
return current;
}
这两个看起来很不一样,我不知道哪种方法是正确的,一般来说解决这个问题的正确方法是什么
【问题讨论】:
-
你试过什么?有些人可能想给你一个答案,但大多数人希望看到你至少尝试过一些东西。
-
您发布的不是问题,而是分配给您的问题。因此,除非您不提供您尝试过的内容以及您遇到的具体问题,否则您不会在这里获得太多帮助。
-
@mikelegg 我已经添加了两种类型的代码,谢谢你提醒我
-
第一个解决方案是递归解决方案。第二个是迭代解决方案。两者都是有效的,更多细节请参见:stackoverflow.com/questions/15688019/recursion-versus-iteration
-
我认为这是功课,所以我很犹豫是否提供一个完整的解决方案。您的迭代示例是 C 代码,因此可能有点难以阅读。考虑递归方法,要使其迭代,您需要插入一个循环。当你来到递归的
Find调用时,看看是否可以去掉调用,改为修改变量,使其与函数调用具有相同的效果。另见stackoverflow.com/questions/159590/…
标签: c# data-structures binary-tree binary-search-tree