1. 程式人生 > >C語言實現二叉排序樹的基本運算演算法

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