程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 二叉查找樹的實現

二叉查找樹的實現

編輯:C++入門知識

1、二叉查找樹的實現:


[cpp]  include<stdio.h>  
#include<stdlib.h>  
 
typedef struct Node{ //定義二叉樹類型  
        int data; 
        struct Node *parent; 
        struct Node *lchild; 
        struct Node *rchild; 
}BiTreeNode,*BiTree; 
 
//二叉樹的查找,如果找到關鍵字為x,則返回指向節點的指針,否則返回null  
BiTree BSTSearch(BiTree T,int x){ 
        BiTreeNode *p; 
        if(T != NULL){ 
                p=T; 
                while(p != NULL){ 
                        if(x == p->data) 
                                return p; 
                        else if(x < p->data) 
                                p = p->lchild; 
                        else 
                                p = p->rchild; 
                } 
        } 
        return NULL; 

//使用遞歸來實現查找算法  
BiTree BSTSearch2(BiTree T,int x){ 
        if(T == NULL) 
                return NULL; 
        if(x<T->data) 
                return BSTSearch2(T->lchild,x); 
        else if(x>T->data) 
                return BSTSearch2(T->rchild,x); 
        else 
                return T; 

 
//二叉查找樹的插入操作  
int BSTInsert(BiTree *T,int x){ 
        BiTreeNode *p,*cur,*parent=NULL; 
        cur = *T; 
        while(cur != NULL){ 
                if(cur->data == x) 
                        return 0; //已存在關鍵字為x的節點,插入失敗  
                parent = cur; 
                if(x<cur->data) 
                        cur = cur->lchild; 
                else 
                        cur = cur->rchild; 
        } 
        p=(BiTreeNode *)malloc(sizeof(BiTreeNode)); 
        if(!p) 
                return -1; 
        p->data = x; 
        p->parent=parent; 
        p->lchild=NULL; 
        p->rchild=NULL; 
        if(!parent) 
                *T = p; 
        else if(x < parent->data) 
                parent->lchild = p; 
        else 
                parent->rchild = p; 
        return 1; 

 
//從二叉查找樹中刪除節點s,並使該二叉查找樹性質不變  
void DeleteNode(BiTree *s){ 
        BiTree q,x,y; 
        if(!(*s)->rchild){//如果s的右子樹為空,則s的左子樹成為被刪節點雙親節點的左子樹  
                q=*s; 
                *s= (*s)->lchild; 
                free(q); 
        } 
        else if(!(*s)->lchild){//如果s的左子樹為空,則s的右子樹成為被刪節點雙親節點的右子樹  
                q=*s; 
                *s= (*s)->rchild; 
                free(q); 
        } 
        else{//如果s的左右子樹都存在,則使s的直接前驅節點代替s,並使其直接前驅節點的左子樹成為其雙親節點的右子樹節點  
                x=*s; 
                y=(*s)->lchild; 
                while(y->rchild){//查找s的直接前驅節點,y為s的直接前驅節點,x為y的雙親節點  
                        x=y; 
                        y=y->rchild; 
                } 
                (*s)->data=y->data;//節點s被y取代  
                if(x!=*s)//如果節點s的左孩子節點不存在右子樹  
                        x->rchild=y->lchild;//使y的左子樹成為x的右子樹  
                else 
                        x->lchild=y->lchild; 
                free(y); 
        } 
 

 
//在二叉查找樹T中找到關鍵字為x的結點,並刪除,刪除成功返回1,否則返回0  
int BSTDelete(BiTree *T,int x){ 
        if(!*T) 
                return 0; 
        else{ 
                if(x == (*T)->data) 
                        DeleteNode(T); 
                else if(x<(*T)->data) 
                        return BSTDelete(&(*T)->lchild,x); 
                else 
                        return BSTDelete(&(*T)->rchild,x); 
                return 1; 
        } 

 
void InOrderTraverse(BiTree T){ 
        if(T){ 
                InOrderTraverse(T->lchild); 
                printf("%d \n",T->data); 
                InOrderTraverse(T->rchild); 
        } 

 
BiTree BSTMinNode(BiTree T){ 
        BiTree p = T; 
        while(p->lchild) 
                p = p->lchild; 
        return p; 

 
BiTree BSTMaxNode(BiTree T){ 
        BiTree p = T; 
        while(p->rchild) 
                p = p->rchild; 
        return p; 

 
BiTree BSTSearchSuccessor(BiTree T){ 
        if(T->rchild) 
                return BSTMinNode(T->rchild); 
        BiTree p = T->parent; 
        while(p!=NULL && T == p->rchild){ 
                T = p; 
                p = p->parent; 
        } 
        return p; 

 
BiTree BSTSearchPredecessor(BiTree T){ 
        if(T->lchild) 
                return BSTMaxNode(T->lchild); 
        BiTree p = T->parent; 
        while(p!=NULL && T == p->lchild){ 
                T = p; 
                p = p->parent; 
        } 
        return p; 

 
#define LEN 10  
int generate_array(int *array){ 
        int i=0; 
        srand((unsigned)time(NULL)); 
        for(i=0;i<LEN;i++){ 
                array[i]=rand()%100; 
                printf("%d  ",array[i]); 
        } 
        printf("\n"); 
        return 0; 

 
int main(void){ 
        int num[LEN]; 
        generate_array(num); 
        BiTree T = NULL; 
        int i; 
        for(i=0;i<LEN;i++){ 
                BSTInsert(&T,num[i]); 
        } 
        printf("中序遍歷二叉查找樹:\n"); 
        InOrderTraverse(T); 
        printf("查找:\n"); 
        for(i=0;i<100;i++){ 
                if(BSTSearch2(T,i)) 
                        printf("樹中存在:%d\n",i); 
        } 
        printf("最大的結點值為:%d\n",BSTMaxNode(T)->data); 
        printf("最小的結點值為:%d\n",BSTMinNode(T)->data); 
        printf("%d",num[4]); 
        BiTree p; 
        if(p=BSTSearchPredecessor(BSTSearch2(T,num[4]))){ 
                printf("的前驅結點為:%d \n",p->data); 
        } 
        else 
                printf("沒有前驅結點\n"); 
        if(p=BSTSearchSuccessor(BSTSearch2(T,num[4]))){ 
                printf("後繼結點為:%d \n",p->data); 
        } 
        else 
                printf("沒有後繼結點\n"); 
        printf("刪除小於50的結點:\n"); 
        for(i=0;i<50;i++){ 
                if(BSTDelete(&T,i)) 
                        printf("刪除結點:%d\n",i); 
        } 
        printf("刪除後中序遍歷:\n"); 
        InOrderTraverse(T); 
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved