1樓:匿名使用者
這是個除錯程式。你自己也可以驗正下。(遞迴想久了,頭都大了)還有這個排序只是對換資料。不是改變指標。這樣結構體大時就不能用了。
#include //二叉樹排序。
#include
typedef struct btree//結構。
btree *create(int n)//建表else return null;
void commute(btree *p,btree *pre)//交換兩個數的值。
void endpre(btree *p,btree *pre)//後序遍歷 +排序。
void headpre(btree *p)//前序遍歷void depth(btree *p,int lev,int *pe)//求二叉樹深度。
int main()
根據關鍵字序列畫二叉排序樹
2樓:匿名使用者
第乙個數字為根結點,把接下來的分成比30大還有比30小的,小的數放左邊,大的放右邊,然後按照數字出現的順序乙個乙個排,比根結點大則放右邊,小則放左邊。
3樓:亥俐愚漾
30下面左15右43
15下面左8右25
43下面右49
8下面右13
25下面左20右28
49下面左46右55
13下面左10
二叉排序樹怎麼構造
4樓:旅遊達人在此
假設二叉排序樹t為空,則建立乙個keyword為k的結點。將其作為根結點。
否則將k和根結點的keyword進行比較,假設相等則返回,假設k小於根結點的keyword則插入根結點的左子樹中,否則插入根結點的右子樹中。
int insertbst(bstnode *p, keytype k)
else if(k==p->key)
return 0;
else if(kkey)
return insertbst(p->lchild, k);
elsereturn insertbst(p->rchild, k);
二叉排序樹的生成演算法:
5樓:水瓶教育研究所
二叉排序樹本身是動態查詢表的一種表示形式,有時會在查詢過程中插入或者刪除表中元素,當因為查詢失敗而需要插入資料元素時,該資料元素的插入位置一定位於二叉排序樹的葉子結點,並且一定是查詢失敗時訪問的最後乙個結點的左孩子或者右孩子。
構造乙個二叉排序樹
6樓:大少爺
二叉排序樹:或者是一棵空樹,或者是具有下列性質的二叉樹:
1. 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
2. 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
3. 它的左、右子樹也分別為二叉排序樹。
7樓:愛可生雲資料庫
二叉樹的基本概念可以了解一下。
二叉排序樹(binary sort tree),首先它是一棵樹,「二叉」這個描述已經很明顯了,就是樹上的一根樹枝開兩個叉,於是遞迴下來就是二叉樹了(下圖所示),而這棵樹上的節點是已經排好序的,具體的排序規則如下:
若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值若右子樹不空,則右字數上所有節點的值均大於它的根節點的值它的左、右子樹也分別為二叉排序數(遞迴定義)從圖中可以看出,二叉排序樹組織資料時,用於查詢是比較方便的,因為每次經過一次節點時,最多可以減少一半的可能,不過極端情況會出現所有節點都位於同一側,直觀上看就是一條直線,那麼這種查詢的效率就比較低了,因此需要對二叉樹左右子樹的高度進行平衡化處理,於是就有了平衡二叉樹(balenced binary tree)
所謂「平衡」,說的是這棵樹的各個分支的高度是均勻的,它的左子樹和右子樹的高度之差絕對值小於1,這樣就不會出現一條支路特別長的情況。於是,在這樣的平衡樹中進行查詢時,總共比較節點的次數不超過樹的高度,這就確保了查詢的效率(時間複雜度為o(logn))
二叉排序樹
8樓:白露飲塵霜
二叉排序樹也叫二叉搜尋樹、二叉查詢樹。二叉排序樹樹是一顆它的左子樹上的節點都小於根節點,右子樹上的節點都大於根節點的二叉樹,且其左右子樹也是二叉排序樹。
例項。當要向二叉排序樹中插入元素的時候,從根節點開始查詢,先將根節點作為當前節點,如果要插入的值比當前節點的值小,則判斷當前節點的左孩子是不是空,如果是空則將要插入的值作為當前節點的左孩子,不是空則將當前節點的左孩子作為當前節點繼續查詢;當要插入的值比當前節點的值大時,判斷當前節點的右孩子是不是空,如果是空則將要插入的值作為當前節點的右孩子,不是空則把當前節點的右孩子作為當前節點繼續查詢。
節點定義。遞迴實現。
非遞迴實現。
使用中序遍歷,遍歷出來的結構剛好是乙個公升序排列的數列。
遞迴寫法。非遞迴寫法。
搜尋二叉排序樹的時候,從根節點開始搜尋,將根節點作為當前節點,如果當前節點的值和搜尋的值相等,則搜尋結束,返回成功;如果當前節點的值小於搜尋值,則判斷當前節點的左孩子是不是空,如果是空,則搜尋的值不在樹中,搜尋結束返回失敗,如果不為空,則將當前節點的左孩子作為當前節點,繼續搜尋;如果當前節點的值大於搜尋值,則判斷當前節點的右子樹是不是空,如果是空,則搜尋的值不在樹中,搜尋結束,返回失敗,如果不為空,則將當前節點的右孩子作為當前節點,繼續搜尋。
二叉排序樹的刪除分為如下三種基本的情況。
直接刪除節點即可。
將要刪除的節點的孩子節點替換當前節點即可。
在要刪除的節點的右子樹中找乙個最小的值來替換掉要刪除的節點,同時將這個最小的節點刪除掉(也可以從左子樹中找乙個最大的節點)
具體情況。演算法實現:
二叉排序樹的查詢時間與二叉樹的高度有關,高度越高需要的查詢時間就越多。
二叉排序樹的高度有兩種極端的情況,一種是完全二叉樹,一種是每層只有乙個節點的情況,變成了乙個鍊表。
當是完全二叉樹的時候:這種情況下的時間複雜為o(log2n)
當每一層只有乙個節點時,也就是鍊表的時候:這種情況下的時間複雜度為o(n)
o(n)之間。
二叉排序樹的應用
9樓:匿名使用者
當用線性表作為表的組織形式時,可以有三種查詢法。其中以二分查詢效率最高。但由於二分查詢要求表中結點按關鍵字有序,且不能用鍊表作儲存結構,因此,當表的插入或刪除操作頻繁時,為維護表的有序性,勢必要移動表中很多結點。
這種由移動結點引起的額外時間開銷,就會抵消二分查詢的優點。也就是說,二分查詢只適用於靜態查詢表。若要對動態查詢表進行高效率的查詢,可採用下面介紹的幾種特殊的二叉樹或樹作為表的組織形式。
不妨將它們統稱為樹表。下面將分別討論在這些樹表上進行查詢和修改操作的方法。
1、二叉排序樹的定義。
二叉排序樹(binary sort tree)又稱二叉查詢(搜尋)樹(binary search tree)。其定義為:二叉排序樹或者是空樹,或者是滿足如下性質的二叉樹:
若它的左子樹非空,則左子樹上所有結點的值均小於根結點的值;
若它的右子樹非空,則右子樹上所有結點的值均大於根結點的值;
左、右子樹本身又各是一棵二叉排序樹。
上述性質簡稱二叉排序樹性質(bst性質),故二叉排序樹實際上是滿足bst性質的二叉樹。
2、二叉排序樹的特點。
由bst性質可得:
1) 二叉排序樹中任一結點x,其左(右)子樹中任一結點y(若存在)的關鍵字必小(大)於x的關鍵字。
2) 二叉排序樹中,各結點關鍵字是惟一的。
注意: 實際應用中,不能保證被查詢的資料集中各元素的關鍵字互不相同,所以可將二叉排序樹定義中bst性質(1)裡的"小於"改為"大於等於",或將bst性質(2)裡的"大於"改為"小於等於",甚至可同時修改這兩個性質。
3) 按中序遍歷該樹所得到的中序序列是乙個遞增有序序列。
例】下圖所示的兩棵樹均是二叉排序樹,它們的中序序列均為有序序列:2,3,4,5,7,8。
3、二叉排序樹的儲存結構。
typedef int keytype; /假定關鍵字型別為整數。
typedef struct node bstnode;
typedef bstnode *bstree; /bstree是二叉排序樹的型別。
二叉樹的一些問題
答案正確啊,如下圖 經改正後能正常執行,無限輸入主要是由於scanf引起的詳細請看 注意構建樹的輸入順序 比如要構建 1 2 5 3 4 這棵樹,則輸入應為1 2 3 4 5 include stdio.h include malloc.h define maxsize 100 typedef ch...
(C語言)關於二叉排序樹的建立和查詢
include include typedef struct np node node create void node t node a,int d else if d a dat else if ddat return a void inorder node r int ser node so,...
假設一棵二叉樹的按層次遍歷序列為abcdefghij,中序遍
墨汁諾 層序遍歷為二叉樹的根,看中序遍歷,a左邊的是a的左子樹的節點,右邊的是右子樹節點,看層序,b是a的左子樹的根,c是a的右子樹的跟 因為c本身就是a的右子樹,由第一步可知 依次類推。一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若...