當前位置:編程學習大全網 - 源碼下載 - 數據結構課程設計:二叉排序樹的實現

數據結構課程設計:二叉排序樹的實現

/*以下是用c++ 實現的二叉排序樹的源代碼*/

#include<iostream.h>

typedef struct TreeNode

{

int key;

struct TreeNode *left;

struct TreeNode *right;

}treeNode;

class BiSortTree

{

public:

BiSortTree(void);

void desplayTree(void);//顯示這個樹

void insertTree(int key);//在樹中插入壹個值

deleteTree(int key);//在樹中刪除壹個值

treeNode* searchTree(int key);//在樹中查找壹個值

~BiSortTree();

private:

treeNode* buildTree(treeNode* head,int number);//建立壹個樹

treeNode* search(treeNode* head ,int key);//查找

treeNode* BiSortTree::searchParent(treeNode* head,treeNode* p);//查找出p的父親節點的指針

treeNode* BiSortTree::searchMinRight(treeNode* head);//找到右子樹中最小的節點

void showTree(treeNode* head);//顯示

void destroyTree(treeNode* head);//刪除

treeNode *Head;

};

/**************以下是建立壹個二叉排序樹****************/

BiSortTree::BiSortTree()

{

cout<<"建立壹棵二叉排序樹,請輸入妳要建樹的所有數(以-1 作為結束標誌!): "<<endl;

Head=NULL;

int number;

cin>>number;

while(number!=-1)

{

Head=buildTree(Head,number);

cin>>number;

}

}

treeNode* BiSortTree::buildTree(treeNode* head,int number)

{

treeNode *p;

p=new treeNode;

p->key=number;

p->left =p->right=NULL;

if(head==NULL)

{

return p;

}

else

{

if(p->key <head->key)

head->left=buildTree(head->left,number);

else

head->right=buildTree(head->right,number);

return head;

}

}

/*****************以下是在壹棵二叉排序樹插入壹個數***********************************/

void BiSortTree::insertTree(int key)

{

Head=buildTree(Head,key);

}

/*****************以下是在壹個二叉排序樹查找壹個數是否存在*************************/

treeNode* BiSortTree::searchTree(int key)

{

return search(Head,key);

}

treeNode* BiSortTree::search(treeNode* head ,int key)

{

if(head==NULL)

return NULL;

if(head->key==key)

return head;

else

{

if(key<head->key )

return search( head->left,key);

else

return search(head->right,key);

}

}

/************以下是在壹個二叉排序樹刪除壹個給定的值*********************************/

BiSortTree::deleteTree(int key)

{

treeNode *p;

p=NULL;

p=search(Head,key);

if(p==NULL)

{

cout<<"Don't find the key";

}

if(p==Head)

{

Head=NULL;

}

else

{

treeNode* parent;

parent=searchParent(Head,p);

if(p->left==NULL&&p->right==NULL)//葉子節點

{

if(parent->left==p)

{

parent->left=NULL;

}

else

{

parent->right=NULL;

}

}

else//非葉子節點

{

if(p->right==NULL)//該節點沒有右孩子

{

if(parent->left==p)

{

parent->left=p->left ;

}

else

{

parent->right=p->left;

}

}

else//該點有左右孩子

{

treeNode * rightMinSon,* secondParent;//secondParent為右子樹中的最小節點的父親

rightMinSon=searchMinRight(p->right);

secondParent=searchParent(p->right ,rightMinSon);

secondParent->left=rightMinSon->right;

if(p->right==rightMinSon)//右子樹中的最小節點的父親為p

{

p->right=rightMinSon->right ;

}

p->key=rightMinSon->key ;

}

}

}

}

treeNode* BiSortTree::searchParent(treeNode* head,treeNode* p)

{

if(head->left==p||head->right==p||head==p||head==NULL)

return head;

else

{

if(p->key<head->key)

return searchParent(head->left ,p);

else

return searchParent(head->right ,p);

}

}

treeNode* BiSortTree::searchMinRight(treeNode* head)//找到右子樹中最小的節點

{

if(head->left ==NULL||head==NULL)

{

return head;

}

else

{

return searchMinRight(head->left);

}

}

/*****************以下是顯示壹個二叉排序樹****************************************/

void BiSortTree::desplayTree(void)

{

showTree(Head);

cout<<endl;

}

void BiSortTree::showTree(treeNode* Head)

{

if(Head!=NULL)

{

showTree(Head->left ) ;

cout<<Head->key<<' ' ;

showTree(Head->right) ;

}

}

/*****************以下是刪除壹棵整二叉排序樹************************************/

BiSortTree::~BiSortTree()

{

cout<<"已經消除了壹棵樹!!!!"<<endl;

destroyTree(Head);

}

void BiSortTree::destroyTree(treeNode* head )

{

if(head!=NULL)

{

destroyTree(head->left );

destroyTree(head->right );

delete head;

}

}

/*********************/

void print()

{

cout<<endl<<endl<<"以下是對二叉排序樹的基本操作:"<<endl

<<"1.顯示樹"<<endl

<<"2.插入壹個節點"<<endl

<<"3.尋找壹個節點"<<endl

<<"4.刪除壹個節點"<<endl;

}

void main()

{

BiSortTree tree;

int number;

int choiceNumber;

char flag;

while(1)

{

print() ;

cout<<"請選擇妳要進行的操作(1~4)"<<endl;

cin>>choiceNumber;

switch(choiceNumber)

{

case 1:

tree.desplayTree();break;

case 2:

cout<<"請插入壹個數: "<<endl;

cin>>number;

tree.insertTree(number);

tree.desplayTree();

break;

case 3:

cout<<"請插入妳要找數: "<<endl;

cin>>number;

if(tree.searchTree(number)==NULL)

{

cout<<"沒有發現"<<endl;

}

else

{

cout<<"發現"<<endl;

}

break;

case 4:

cout<<"請輸入妳要刪除的數: "<<endl;

cin>>number;

tree.deleteTree(number);

tree.desplayTree();

break;

default: break;

}

cout<<"妳是否要繼續(Y/N)?"<<endl;

cin>>flag;

if(flag=='N'||flag=='n')

break;

}

}

  • 上一篇:1.76原創傳奇手遊
  • 下一篇:使用Python做數據分析的優點是什麽?
  • copyright 2024編程學習大全網