一個Leaf
結構將是這個樣子:
typedef struct struct_t {
int data;
Leaf * left; //These allow structs to be chained together where each node
Leaf * right; //has two pointers to two more nodes, causing exponential
} Leaf; //growth.
該函數接受一個指向我們稱之爲R
葉和一些數據進行搜索對,它返回一個指向葉
Leaf *findLeaf(Leaf *R,int data){
這段代碼決定我們應該向左還是向右,因爲插入函數遵循相同的左右規則,因此已知樹被排序。
if(R->data >= data){
這是函數的遞歸性的優勢情況下,如果我們已經達到樹中的最後一個節點,稱爲葉,返回葉。
遞歸函數的邊緣情況具有結束遞歸併返回結果的任務。沒有這個,該功能將無法完成。
if(R->left == NULL) return R;
這是我們如何穿過樹,在這裏,我們正在遍歷左側,因爲數據較大。 (更大的數據總是插在左側以保持排序。) 發生了什麼事情是,現在我們調用findLeaf()與R->left
,但想象一下,如果我們在下次調用中再次獲得此點。
它會變成R->left->left
參照第一個電話。如果數據比我們正在操作的當前節點更小,那麼我們會選擇正確的。
else return findLeaf(R->left,data);
現在我們在那裏的數據是比當前節點小的情況下,所以我們要正確。
} else {
這和左邊是完全一樣的。
if(R->right == NULL) return R;
else return findLeaf(R->right,data);
}
}
最後,函數的返回可以概念化爲類似R->right->right->left->NULL
的東西。
讓我們拿這棵樹並用findLeaf()對它進行操作;
findLeaf(Leaf * root, 4) //In this example, root is already pointing to (8)
我們從根開始,在樹,其中包含8
首先的頂部,我們檢查R->data >= data
我們知道R->data
是(8)
和data
是(4)
。由於我們知道data
小於R->data
(當前節點),因此我們輸入if
語句。
這裏我們對左邊的Leaf進行操作,檢查它是否爲NULL
。這不是,所以我們跳到else
。
現在我們返回findLeaf(R->left, data);
,但要返回它,我們必須先解決它。這導致我們進入第二次迭代,我們將(3)
與(4)
進行比較,然後重試。
再次審查整個過程,我們會比較(6) to (4)
,然後最終找到我們的節點,當我們comepare (4) to (4)
。現在,我們將回溯通過函數並返回一個鏈條是這樣的:
R(8)->(3)->(6)->(4)
編輯:另外,巧合的是,我寫了一篇博客文章遍歷鏈表來解釋二叉搜索樹here的性質。
[從這裏開始](http://google.com/search?q=recursion) – 2013-05-01 13:54:59
或者在這裏:http://stackoverflow.com/questions/16319426/need-some-explanation-about-trees-in -c :) – SomeWittyUsername 2013-05-01 13:56:44