【问题标题】:binary search tree (BST) find method in C#C#中的二叉搜索树(BST)查找方法
【发布时间】: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


【解决方案1】:

要将递归解决方案转换为迭代解决方案,我们需要插入一个循环。在递归情况下,我们更改每个递归的节点参数。为了在迭代情况下做同样的事情,我们只需创建一个更新的变量而不是递归。

更改了命名以使示例更加清晰和可编译。另请注意,CompareTo 可以返回任何数字,而不仅仅是 0、1、-1。所以一个开关是不够的:

    public class Node<T>
    {
        public Node<T> Left { get; }
        public Node<T> Right { get; }
        public T Value { get; }

        public Node(Node<T> left, Node<T> right, T value)
            => (Left, Right, Value) = (left, right, value);
    }

    public static Node<T> Find<T>(Node<T> root, T target) where T : IComparable<T>
    {
        var current = root;
        while (current != null)
        {
            var comparison = target.CompareTo(current.Value);
            if (comparison > 0) 
                current = current.Right;
            else if (comparison < 0)
                current = current.Left;
            else
                return current;

        }
        return null;
    }

另请参阅how to transform a recursive method to an iterative one 以更通用的方式。请注意,该示例使用堆栈,在您的情况下不需要堆栈,因为您只处理树的一个分支。

【讨论】:

    猜你喜欢
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2020-09-03
    • 2012-05-13
    相关资源
    最近更新 更多