#include"stdafx.h" #include"Basic_Symbol.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为根节点,插入关键字为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); else return InsertBST(p->rchild,k); //大于,放右边,满足二叉排序树的特点 } BSTNode *CreatBST(KeyType A[],int n) //利用数组A中的元素作为关键字来构造二叉树,n为要建立的结点个数,应小于数组长度 { BSTNode *bt = NULL; int i = 0; while(i< n) //循环加递归构造二叉排序树 if(InsertBST(bt,A[i]) == 1) { printf("\nthe number %d step:",i+1,A[i]); DispBST(bt); i++; } return bt; //返回根指针 } void Delete1(BSTNode *p,BSTNode *&r) //当被删除结点p有左右子树时的删除过程 { BSTNode *q; if(r->rchild != NULL) //如果右孩子不为空 { Delete1(p,r->rchild); //删除右孩子 } else { p->key = r->key; q = r; r = r->lchild; free(q); } } void Delete( BSTNode *&p) //从二叉排序树中删除*p结点 { BSTNode *q; if(p->rchild == NULL) //没有右子树的情况 { q = p; p = p->lchild; free(q); } else if(p->lchild == NULL) //没有左子树 { q = p; p = p->rchild; free(q); } else Delete1(p,p->lchild); //左右都有 } int DeleteBST(BSTNode *&bt,KeyType k) //在bt中删除关键字为k的结点 { if(bt == NULL) return 0; //空树,删除失败 else { if(k < bt->key) return DeleteBST(bt->lchild,k); else if(k>bt->key) return DeleteBST(bt->rchild,k); else { Delete(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) { 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; int JudgeBST(BSTNode *bt) { 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 n = 10; int a[] = {4,9,0,1,8,6,3,5,2,7}; printf("create a BST Tree:\n"); bt = CreatBST(a,n); printf("BST:\n"); DispBST(bt); printf("\n"); printf("bt%s\n",(JudgeBST(bt)?"yes,it is a bst":"no,it is not a bst")); printf("\n"); printf("\nsearch the keyword(di gui) : %d",k); SearchBST1(bt,k,path, -1); printf("\nsearch the keyword(not di gui) : %d",k); printf("\ndelete..."); printf("\nthe origin BST:"); DispBST(bt); printf("\n delete the node 4.."); DeleteBST(bt,4); DispBST(bt); printf("\n delete the node 5.."); DeleteBST(bt,5); DispBST(bt); printf("\n"); }
算法基础(七):二叉排序树基本操作-插入、删除(附源代码加注释),布布扣,bubuko.com
算法基础(七):二叉排序树基本操作-插入、删除(附源代码加注释)
原文:http://blog.csdn.net/zjc_game_coder/article/details/21038935