C語(yǔ)言實(shí)現(xiàn)BST二叉排序樹的基本操作
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)BST二叉排序樹的基本操作代碼,供大家參考,具體內(nèi)容如下
BST-二叉排序樹的幾個(gè)基本操作。
頭文件聲明與函數(shù)定義
#include <stdio.h> #include <stdlib.h> typedef int ElemType; /** * 定義節(jié)點(diǎn) */ typedef struct BSTNode{ ElemType data;//數(shù)據(jù)域 struct BSTNode *lchild,//左孩子 *rchild;//右孩子 }BSTNode; /** * 插入節(jié)點(diǎn) */ int BST_InsertNode(BSTNode** bstNode,ElemType e); /** * 創(chuàng)建BST樹 */ void BST_Create(BSTNode** bstTree,ElemType* dataSet,int n); /** * 查找BST樹節(jié)點(diǎn) */ BSTNode* BST_SearchNode(BSTNode** bstNode,ElemType e); /** * 遍歷BST樹節(jié)點(diǎn) */ void BST_PrintNodes(BSTNode* bstNode);
函數(shù)編寫
#include "BSTree.h" /** * 插入節(jié)點(diǎn) */ int BST_InsertNode(BSTNode** bstNode,ElemType e){ //如果BST樹為空,直接創(chuàng)建根節(jié)點(diǎn) if (*bstNode==NULL) { *bstNode=(BSTNode*)malloc(sizeof(BSTNode)); (*bstNode)->data=e; (*bstNode)->lchild=NULL; (*bstNode)->rchild=NULL; return 1; } //如果BST樹不為空,則比較插入值與根節(jié)點(diǎn)值的大小關(guān)系 if ((*bstNode)->data==e) return 0;//關(guān)鍵值相同,則插入失敗 else if ((*bstNode)->data>e) return BST_InsertNode(&(*bstNode)->lchild,e);//大于插入值,將其作為左子樹節(jié)點(diǎn) else if ((*bstNode)->data<e) return BST_InsertNode(&(*bstNode)->rchild,e);//小于插入值,將其作為右子樹節(jié)點(diǎn) } /** * 創(chuàng)建BST樹 */ void BST_Create(BSTNode** bstTree,ElemType* dataSet,int n){ int i=0; *bstTree=NULL;//BST樹初始化為空 while (i<n) { printf("%d\t",dataSet[i]); BST_InsertNode(bstTree,dataSet[i++]); } printf("\n"); } /** * 查找BST樹節(jié)點(diǎn) */ BSTNode* BST_SearchNode(BSTNode** bstNode,ElemType e){ if (*bstNode==NULL)//判空 return *bstNode; //查找結(jié)點(diǎn) if ((*bstNode)->data==e)//驗(yàn)證是否為根節(jié)點(diǎn) return *bstNode; else if ((*bstNode)->data>e) { return BST_SearchNode(&(*bstNode)->lchild,e);//如果小于根節(jié)點(diǎn)的值,查找左子樹 }else { return BST_SearchNode(&(*bstNode)->rchild,e);//如果大于根節(jié)點(diǎn)的值,查找右子樹 } } /** * 遍歷BST樹節(jié)點(diǎn) */ void BST_PrintNodes(BSTNode* bstNode){ if (bstNode==NULL)//根節(jié)點(diǎn)判空 { return; } //打印根節(jié)點(diǎn)的值 printf("%d\t",(bstNode)->data); //從根節(jié)點(diǎn)開始遍歷 if (bstNode->lchild!=NULL) BST_PrintNodes((bstNode)->lchild);//遍歷左子樹 if (bstNode->rchild!=NULL) BST_PrintNodes(bstNode->rchild);//遍歷右子樹 }
測(cè)試
#include "BSTree.h" int main(int argc,char** argv){ int i; ElemType arr[]={45,24,53,45,12,24,68,25,36,96,100,25,64,78};//只有4個(gè)元素,因?yàn)殛P(guān)鍵字重復(fù)的元素不能被插入 BSTNode* bstNode=NULL; BSTNode* bstTemp=NULL; //創(chuàng)建BST樹 BST_Create(&bstNode,arr,sizeof(arr)/sizeof(ElemType)); printf("%d\t%d\n",bstNode,bstNode->data); printf("%d\t%d\n",bstNode,bstNode->lchild->data); //查找結(jié)點(diǎn) bstTemp=BST_SearchNode(&bstNode,53); printf("the aimed node is %d,\n",bstNode->data); //遍歷BST樹的所有節(jié)點(diǎn) BST_PrintNodes(bstNode); printf("\n"); }
貼上測(cè)試結(jié)果如下,【插入和遍歷的節(jié)點(diǎn)數(shù)量不一致是因?yàn)?如果BST樹中的節(jié)點(diǎn)關(guān)鍵值相同,就終止插入操作】
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng)的完整代碼
通訊錄是一個(gè)可以記錄親人、好友信息的工具,下面這篇文章主要給大家介紹了關(guān)于利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08循環(huán)隊(duì)列詳解及隊(duì)列的順序表示和實(shí)現(xiàn)
這篇文章主要介紹了循環(huán)隊(duì)列詳解及隊(duì)列的順序表示和實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-12-12C語(yǔ)言中回調(diào)函數(shù)的含義與使用場(chǎng)景詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中回調(diào)函數(shù)的含義與使用場(chǎng)景,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例
這篇文章主要介紹了Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例,本文代碼中包含大量注釋來(lái)講解CCControlColourPicker控件類的使用,需要的朋友可以參考下2014-09-09C++ OpenCV制作黑客帝國(guó)風(fēng)格的照片
這篇文章主要介紹了如何通過(guò)C++ OpenCV制作出黑客帝國(guó)風(fēng)格的照片,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,需要的可以參考一下2022-01-01