C語言 二叉搜尋樹

2021-08-20 07:09:32 字數 2067 閱讀 1253

實現過程

二叉查詢樹(binary search tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。

簡而言之, 二叉樹的左子樹總是比右字數小。

重要:在之後的關於樹的演算法中,我們構建的樹將使用鍊錶,而不是使用陣列。所以為了實現**,你需要先了解結構體和指標的一些內容。

實現過程

為了比較容易地理解插入排序,我們可以列出一組資料,比如:

個人分析

可以發現我們取出乙個數後,再進行節點值的比較,如果比節點小,則這個數在值的左子樹,這時候,我們在進入左子樹,很顯然我們相當於又是取出乙個數與乙個節點比較,只不過這個時候,節點變成了之前節點的左子樹,所以我們可以用遞迴的方法構建出二叉樹。

實現過程

1 首先我們需要構建乙個節點的結構體

typedef

struct bi btree, *btreeptr;

2 然後就是構建二叉樹, 首先遍歷每個節點放入結構體中,再將結構體插入到主結構體中

btreeptr b = (btreeptr)malloc(sizeof(btree));;

memset(b, 0, sizeof(btree)); //將結構體中的指標初始化

for (int i = 0; i < length; i++)

接下來就是插入二叉樹了,這裡是重點。

void inserttree(btreeptr a, btreeptr b) 

else

else

}else

else }}

//節點高度

if (a->left_child !=

null)

}if (a->right_child !=

null) }}

3 最後,是在二叉樹中搜尋,這裡很簡單,就不提示了。

完整**:

#include 

#include

#include

typedef

struct bi btree, *btreeptr;

void inserttree(btreeptr a, btreeptr b)

else

else

}else

else }}

if (a->left_child != null)

}if (a->right_child != null)

}}int midsearch(const btreeptr a, const

int key)

else

if(key < a->val)

else

}else

}void freetree(btreeptr b)

if (b->left_child != null)

}int binarytreesearch(const

int *a, const

int length, const

int key)

int pos = midsearch(b, key);

freetree(b); //不能直接使用free(b)

return pos;

}void main() ;

printf("%d \n", binarytreesearch(my_array, length, 6));

}

二叉搜尋樹(C語言)

學習二叉搜尋樹的過程中,對於刪除操作中的兩個節點都存在的情況進行 編寫時,出現了疑惑,所以我著重講解一下刪除操作 首先進行資料的宣告 include includetypedef int data type 宣告元素型別 typedef struct bst nodebst t,bst p 傳入根節...

C語言二叉搜尋樹

7 4 是否同一棵二叉搜尋樹 25 分 給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸入包含若干組測試資料。...

C語言搜尋二叉樹

今天和大家分享乙個二叉搜尋樹的實現演算法,二叉搜尋樹是若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值,如下圖 為了能讓這個樹更加完整,不那麼散亂,我將他包裝起來成為一棵樹,然後想,一棵樹裡要寫啥,那肯定是要乙個根節點啦,於是...