C語言實現二叉排序樹的基本運算演算法
二叉排序樹的建立、查詢和刪除過程及其演算法設計。
(1)由關鍵字序列(4,9,0,1,8,6,3,5,2,7)建立一棵二叉排序樹bt並以括號表示法輸出;
(2)判斷bt是否為一棵二叉排序樹;
(3)採用遞迴和非遞迴兩種方法查詢關鍵字6的節點,並輸出其查詢路徑;
(4)分別刪除bt中關鍵字為4和5的結點,並輸出刪除後的二叉排序。
程式碼:
//檔名:exp9-4.cpp
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef 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) //在以*p為根節點的BST中插入一個關鍵字為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); //插入到*p的左子樹中
else
return InsertBST(p->rchild,k); //插入到*p的右子樹中
}
BSTNode *CreatBST(KeyType A[],int n)
//由陣列A中的關鍵字建立一棵二叉排序樹
{
BSTNode *bt=NULL; //初始時bt為空樹
int i=0;
while (i<n)
if (InsertBST(bt,A[i])==1) //將A[i]插入二叉排序樹T中
{
printf(" 第%d步,插入%d:",i+1,A[i]);
DispBST(bt);printf("\n");
i++;
}
return bt; //返回建立的二叉排序樹的根指標
}
void Delete1(BSTNode *p,BSTNode *&r)
//當被刪*p節點有左右子樹時的刪除過程
{
BSTNode *q;
if (r->rchild!=NULL)
Delete1(p,r->rchild); //遞迴找最右下節點
else //找到了最右下節點*r
{
p->key=r->key; //將*r的關鍵字值賦給*p
q=r;
r=r->lchild; //將*r的雙親節點的右孩子節點改為*r的左孩子節點
free(q); //釋放原*r的空間
}
}
void Delete(BSTNode *&p)
//從二叉排序樹中刪除*p節點
{
BSTNode *q;
if (p->rchild==NULL) //*p節點沒有右子樹的情況
{
q=p;p=p->lchild;free(q);
}
else if (p->lchild==NULL) //*p節點沒有左子樹的情況
{
q=p;p=p->rchild;free(q);
}
else Delete1(p,p->lchild); //*p節點既有左子樹又有右子樹的情況
}
int DeleteBST(BSTNode *&bt,KeyType k)
//在bt中刪除關鍵字為k的節點
{
if (bt==NULL) return 0; //空樹刪除失敗
else
{
if (k<bt->key)
return DeleteBST(bt->lchild,k); //遞迴在左子樹中刪除關鍵字為k的節點
else if (k>bt->key)
return DeleteBST(bt->rchild,k); //遞迴在右子樹中刪除關鍵字為k的節點
else //k=bt->key的情況
{
Delete(bt); //呼叫Delete(bt)函式刪除*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); //在左子樹中遞迴查詢
else
SearchBST1(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); //在左子樹中遞迴查詢
else
SearchBST2(bt->rchild,k); //在右子樹中遞迴查詢
printf("%3d",bt->key);
}
void DispBST(BSTNode *bt)
//以括號表示法輸出二叉排序樹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; //predt為全域性變數,儲存當前節點中序前趨的值,初值為-∞
int JudgeBST(BSTNode *bt) //判斷bt是否為BST
{
int b1,b2;
if (bt==NULL)
return 1;
else
{
b1=JudgeBST(bt->lchild);
if (b1==0 || predt>=bt->key)
return 0;
predt=bt->key;
b2=JudgeBST(bt->rchild);
return b2;
}
}
void main()
{
BSTNode *bt;
KeyType k=6;
int a[]={4,9,0,1,8,6,3,5,2,7},n=10;
printf("建立一棵BST樹:");
printf("\n");
bt=CreatBST(a,n);
printf("BST:");DispBST(bt);printf("\n");
printf("bt%s\n",(JudgeBST(bt)?"是一棵BST":"不是一棵BST"));
printf(" 查詢%d關鍵字(遞迴,順序):",k);SearchBST1(bt,k,path,-1);
printf("查詢%d關鍵字(非遞迴,逆序):",k);SearchBST2(bt,k);
printf("\n刪除操作:\n");
printf(" 原BST:");DispBST(bt);printf("\n");
printf(" 刪除節點4:");
DeleteBST(bt,4);
DispBST(bt);printf("\n");
printf(" 刪除節點5:");
DeleteBST(bt,5);
DispBST(bt);
printf("\n");
}
相關推薦
C語言實現二叉排序樹的基本運算演算法
二叉排序樹的建立、查詢和刪除過程及其演算法設計。 (1)由關鍵字序列(4,9,0,1,8,6,3,5,2,7)建立一棵二叉排序樹bt並以括號表示法輸出; (2)判斷bt是否為一棵二叉排序樹; (3)採用遞迴和非遞迴兩種方法查詢關鍵字6的節點,並輸出其查詢路徑; (4)分別刪
資料結構之---C語言實現二叉排序樹(BinarySortTree)
wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------
C語言實現二叉排序樹
二叉排序樹的插入規則: 在二叉排序樹中插入新結點,要保證插入後的二叉樹仍符合二叉排序樹的定義。 插入過程:若二叉排序樹為空,則待插入結點*S作為根結點插入到空樹中; 當非空時,將待插結點關鍵字S->key和樹根關鍵字t->key進行
C語言實現二叉查詢樹(BST)的基本操作
我們在上一篇部落格中講解了二叉樹,這一次我們來實現二叉樹的進階——二叉查詢樹(Binary Search Tree),又稱二插排序樹(Binary Sort Tree)。所以簡稱為BST。二插查詢樹的定義如下:1.若左子樹不為空,則左子樹上所有節點的值均小於它的根節
go語言實現二叉排序樹及其前序遍歷
結構 左右指標和存值的一個int type AVL struct{ left,right *AVL value int } 獲取左右節點的指標 func (a *AVL)getLeft()(*AVL) { if a.left != nil{ return
C語言之二叉排序樹
typedef struct BiTNode{ int data; struct BiTNode *lchild; struct BiTNode *rchild;}Bintree; #include<stdio.h>
資料結構與演算法(C語言) | 二叉排序樹
二叉排序樹的定義—— 二叉排序樹 ( Binary Sort Tree) 或者為空;或者是具有如下特性的二叉樹: (1)若根的左子樹不空,則左子樹上所有結點的關鍵字均小於根結點的關鍵字; (2)若
C語言實現二叉查詢樹的輸出
二叉樹是資料結構和演算法中的重要部分。本文將簡單介紹其中的一類——二叉查詢樹: 二叉排序樹(BinarySortTree),又稱二叉查詢樹、二叉搜尋樹。它或者是一棵空樹;或者是具有下列
C語言實現二叉樹各種基本運算的演算法
包含如下函式: CreateBTree( BTNode * &b, char * str ) : 由 括號表 示 串 str 創 建二叉鏈b ; FindNode( BTNode * &b, ElemType x ) : 返回data域 為 x的節
C語言實現二叉樹的基本操作
我在前面的部落格中講解了連結串列、棧和佇列,這些資料結構其實都是線性表,並且給出了詳細的實現。從今天開始,我們將要來學習樹,樹作為一種資料結構我們經常會用到,作為起步和基礎,我們先來實現二叉樹,也就是每個節點有不超過2個子節點的樹。對於樹的操作,最基本的建立、遍
C語言二叉排序樹基本操作
定義: 二叉排序樹是一棵特殊的二叉樹。其必須滿足:要麼為空樹或者樹上任一結點,其值大於等於其左子樹上的任意結點值(左子樹非空),且小於其右子樹上任意結點的值(右子樹非空),其左右子樹也滿足該定義。 結
[C語言實現]實現二叉查詢樹基本操作(遞迴版,圖示)
定義 二叉查詢樹是一種特殊的二叉樹,它不僅是一顆二叉樹,還滿足如下性質 對於任何非葉子節點,他的左節點都小於它本身,而右節點都大於其本身. 它的左右子樹也分別而二叉搜尋樹 一般情況下,在這麼一棵樹中進行查詢,它的時間複雜度是 longnlon
二叉排序樹基本功能實現(C++)
二叉排序樹(Binary Sort Tree )也稱二叉搜尋樹(Binary Search Tree),以下簡稱BST。 它的特點是左小右大(左子樹小於根,右子樹大於根),令人困惑的是他不允許相等存在,一定要分個高低。這個特點與二叉堆排序有所不同,堆是允許存在相同關鍵字
C語言實現二叉樹的基本操作---建立、遍歷、求深度、求葉子結點
#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedefint ElemType;//資料型別 //定義二叉樹結構,與單鏈表相似,多了一個右孩子結點 typed
c語言實現二叉樹的基本操作--二叉連結串列儲存
利用二叉連結串列儲存,並且利用遞迴的方法實現二叉樹的遍歷(前序遍歷、中序遍歷和後續遍歷)操作。 c語言具體實現程式碼如下: #include<stdio.h> #include<stdlib.h> #include<malloc.h>
C++實現二叉排序樹
1.定義 二叉排序樹(Binary Sort Tree),又稱二叉查詢樹(Binary Search Tree),亦稱二叉搜尋樹。 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹: (1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; (2)若右子樹不空,則右子樹上所
C語言實現二叉樹中統計葉子結點的個數&度為1&度為2的結點個數
演算法思想 統計二叉樹中葉子結點的個數和度為1、度為2的結點個數,因此可以參照二叉樹三種遍歷演算法(先序、中序、後序)中的任何一種去完成,只需將訪問操作具體變為判斷是否為葉子結點和度為1、度為2的結點及統計操作即可。 #include <stdio.h> #include &
C語言實現二叉樹的建立&遍歷
演算法思想(重點是遞迴的使用) 利用擴充套件先序遍歷序列建立二叉連結串列 採用類似先序遍歷的遞迴演算法,首先讀入當前根結點的資料,如果是'.'則將當前 樹根置為空,否則申請一個新結點,存入當前根結點的資料,分別用當前根結點的 左子域和右子域進行遞迴呼叫,建立左、右子樹.
c語言實現二叉樹的插入、查詢、刪除、列印樹
目錄: 二叉樹的關鍵概念: 每個節點是一個自引用結構體,形式如下: struct TreeNode { struct TreeNode *leftPtr; /* pointer to left subtree */
C語言實現二叉樹的各種遍歷及求解深度
#include<stdio.h> #include<malloc.h> #define MAXSIZE 100 typedef char dataType; //二叉樹結構 typedef struct bnode{ dataType data; struct bnode *lC