[英]binary search tree (BST) find method in C#
如何編寫具有這些要求的代碼? 這就是問題:檢查樹 T 中是否存在鍵為 K 的節點,如果有,則返回對該節點的引用。 如果樹為空,則報告未找到該節點並停止。 否則,將 K 與根節點 X 的鍵值進行比較。
這是我發現的:
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.