簡體   English   中英

C# 中的二叉搜索樹 (BST) 查找方法

[英]binary search tree (BST) find method in C#

如何編寫具有這些要求的代碼? 這就是問題:檢查樹 T 中是否存在鍵為 K 的節點,如果有,則返回對該節點的引用。 如果樹為空,則報告未找到該節點並停止。 否則,將 K 與根節點 X 的鍵值進行比較。

  • 如果 K=X,則發出到該節點的鏈接並停止。
  • 如果 K>X,則遞歸搜索 T 的右子樹中的鍵 K。
  • 如果 K<X,則遞歸搜索 T 的左子樹中的鍵 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;
}

這兩個看起來非常不同,我不知道哪種方法是正確的,一般來說解決這個問題的正確方法是什么

要將遞歸解決方案轉換為迭代解決方案,我們需要插入一個循環。 在遞歸情況下,我們更改每個遞歸的節點參數。 為了在迭代的情況下做同樣的事情,我們只需創建一個更新的變量而不是進行遞歸。

更改命名以使示例更清晰和可編譯。 另請注意,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;
    }

另請參閱如何以更通用的方式將遞歸方法轉換為迭代方法。 請注意,該示例使用堆棧,在您的情況下不需要堆棧,因為您只處理樹的一個分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM