#include<stdio.h>
#include<malloc.h>#define MaxSize 100typedef int KeyType
;
typedef char InfoType
;typedef struct node
{KeyType key
;InfoType data
;struct node
*lchild
,*rchild
;
}BSTNode
;int path
[MaxSize
];void DispBST(BSTNode
*b
);int InsertBST(BSTNode
* &p
,KeyType k
)
{if(p
==NULL){p
=(BSTNode
*)malloc(sizeof(BSTNode
));p
->key
=k
;p
->lchild
=p
->rchild
=NULL;return 1;}else if(k
==p
->key
)return 0;else if(k
<p
->key
)return InsertBST(p
->lchild
,k
);else return InsertBST(p
->rchild
,k
);
}BSTNode
*CreateBST(KeyType A
[],int n
)
{BSTNode
*bt
=NULL;int i
=0;while(i
<n
)if(InsertBST(bt
,A
[i
])==1){printf(" 第%d步,插入%d:",i
+1,A
[i
]);DispBST(bt
);printf("\n");i
++;}return bt
;
}void Delete1(BSTNode
*p
,BSTNode
* &r
)
{BSTNode
*q
;if(r
->rchild
!=NULL)Delete1(p
,r
->rchild
);else{p
->key
=r
->key
;q
=r
;r
=r
->lchild
;free(q
);}
}void Delete(BSTNode
* &p
)
{BSTNode
*q
;if(p
->rchild
==NULL){q
=p
;p
=p
->lchild
;free(q
);}else if(p
->lchild
==NULL){q
=p
;p
=p
->rchild
;free(q
);}else Delete1(p
,p
->lchild
);
}int DeleteBST(BSTNode
* &bt
,KeyType k
)
{if(bt
==NULL)return 0;else{if(k
<bt
->key
)return DeleteBST(bt
->lchild
,k
);else if(k
>bt
->key
)return DeleteBST(bt
->rchild
,k
);else {Delete(bt
);return 1;}}
}void SearchBST1(BSTNode
*bt
,KeyType k
,KeyType path
[],int i
)
{int j
;if(bt
==NULL)return;else if(k
==bt
->key
){path
[i
+1]=bt
->key
;for(j
=0;j
<=i
+1;j
++)printf("%3d",path
[j
]);printf("\n");}else{path
[i
+1]=bt
->key
;if(k
<bt
->key
)SearchBST1(bt
->lchild
,k
,path
,i
+1);elseSearchBST1(bt
->rchild
,k
,path
,i
+1);}
}int SearchBST2(BSTNode
*bt
,KeyType k
)
{if(bt
==NULL)return 0;else if(k
==bt
->key
){printf("%3d",bt
->key
);return 1;}else if(k
<bt
->key
)SearchBST2(bt
->lchild
,k
);elseSearchBST2(bt
->rchild
,k
);printf("%3d",bt
->key
);
}void DispBST(BSTNode
*bt
)
{if(bt
!=NULL){printf("%d",bt
->key
);if(bt
->lchild
!=NULL||bt
->rchild
!=NULL){printf("(");DispBST(bt
->lchild
);if(bt
->rchild
!=NULL)printf(",");DispBST(bt
->rchild
);printf(")");}}
}KeyType predt
=-32767;int JudgeBST(BSTNode
*bt
)
{int b1
,b2
;if(bt
==NULL)return 1;else{b1
=JudgeBST(bt
->lchild
);if(b1
==0||predt
>=bt
->key
)0;predt
=bt
->key
;b2
=JudgeBST(bt
->rchild
);return b2
;}
}int main()
{BSTNode
*bt
;KeyType k
=7;int a
[]={4,9,0,1,8,6,3,5,2,7},n
=10;printf("創(chuàng)建一棵BST樹:");printf("\n");bt
=CreateBST(a
,n
);printf("\nBST:");DispBST(bt
);printf("\n");printf("bt %s\n",(JudgeBST(bt
)?"是一棵BST":"不是一棵BST"));printf("\n");printf("查找%d關(guān)鍵字(遞歸):",k
); SearchBST1(bt
,k
,path
,-1);printf("查找%d關(guān)鍵字(非遞歸):",k
); SearchBST2(bt
,k
);printf("\n\n刪除操作:\n"); printf(" 原BST:"); DispBST(bt
); printf("\n");printf(" 刪除結(jié)點(diǎn)4:"); DeleteBST(bt
,4);DispBST(bt
);printf("\n"); printf(" 刪除結(jié)點(diǎn)5:"); DeleteBST(bt
,5);DispBST(bt
);printf("\n\n"); return 0;
}
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言描述)匯總:
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):英文單詞按字典序排序的基數(shù)排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):直接插入排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):直接選擇排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):置換-選擇算法
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):Huffman樹字符編碼
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):Josephus問題之順序表
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):Josephus問題之循環(huán)鏈接表
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):多項(xiàng)式合并
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):二叉樹之葉子結(jié)點(diǎn)旋轉(zhuǎn)銷毀
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):哈夫曼樹
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):集合的位向量表示
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):鏈接隊(duì)列
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):鏈接棧
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):線性表的單鏈表示
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):線性表的順序表示
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):棧的基本操作
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):中綴表達(dá)式
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):希爾插入排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):索引文件建立和查找
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):冒泡排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):快速排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):可變長度字符串的快速排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):基數(shù)排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):二路歸并排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):堆排序
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):二叉樹搜索樹Kruskal
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):二叉搜索樹Prim
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):最短路徑弗洛伊德算法
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):深度、廣度優(yōu)先生成樹
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):鄰接矩陣轉(zhuǎn)化鄰接表
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):統(tǒng)計(jì)字符串中出現(xiàn)的字符及其次數(shù)
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):順序查找
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):哈希表的相關(guān)運(yùn)算算法
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):分塊法查找
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):二分查找
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):二叉樹遍歷
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):二叉平衡樹的相關(guān)操作算法
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):二叉排序樹的基本操作算法
數(shù)據(jù)結(jié)構(gòu)源碼筆記(C語言):B樹的相關(guān)運(yùn)算算法
總結(jié)
以上是生活随笔為你收集整理的数据结构源码笔记(C语言):二叉排序树的基本操作算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。