一步一步复习数据结构和算法基础-二叉排序树
2012-07-23 19:15
579 查看
在二叉排序树中,大于根节点的数字是其右子树,小于根节点的数字是其左子树,等于根节点的情况,暂时不考虑。
操作:
插入、删除、遍历。
操作:
插入、删除、遍历。
#include <stdio.h> #include <stdlib.h> typedef struct tree { int data; struct tree *lchild,*rchild; }BSTree,*ptree; int SearchBST(ptree T,int key,ptree f,ptree *p) { //如果是空树,返回空 if(!T){(*p)=f;return 0;} else if(T->data == key){(*p)=T;return 1;} else if(T->data > key)return SearchBST(T->lchild,key,T,&(*p)); else return SearchBST(T->rchild,key,T,&(*p)); } int InsertBST(ptree *T,int key) { ptree p,tmp; if(!SearchBST((*T),key,NULL,&p)) { tmp = (ptree)malloc(sizeof(BSTree)); tmp->data = key;tmp->lchild = tmp->rchild = NULL; //如果是空树那么当前节点是根节点 if(!p)(*T) = tmp; //如果不是空树,那么p返回的是应该插入位置的父节点位置 else if(p->data > key)p->lchild = tmp; else p->rchild = tmp; return 1; } return 0; } void InorderTree(ptree root) { if(root) { InorderTree(root->lchild); printf("%d ",root->data); InorderTree(root->rchild); } } int Delete(ptree *node) { ptree q,s; //没有右孩子 if(!(*node)->rchild) { q = (*node);(*node) = (*node)->lchild;free(q); } //没有左孩子 else if(!(*node)->lchild) { q = (*node);(*node) = (*node)->rchild;free(q); } //有两个孩子 else { q=(*node);s=(*node)->lchild; //向右子树循环 while(s->rchild){q=s;s=s->rchild;} //当前节点的数值替换(等效于删除) (*node)->data = s->data; if(q!=(*node))q->rchild=s->lchild; else q->lchild = s->lchild; free(s); } return 1; } //删除制定的数字 int DeleteBST(ptree *root,int key) { //要想删除制定的数字需要先查找相应的数字 if(!(*root))return 0; else { if((*root)->data == key)return Delete(root); else if((*root)->data > key)return DeleteBST(&(*root)->lchild,key); else return DeleteBST(&(*root)->rchild,key); } } int main() { ptree root; int key,result; root = NULL; while(scanf("%d",&key) != EOF) { result = InsertBST(&root,key); } InorderTree(root); printf("\n"); DeleteBST(&root,23); InorderTree(root); printf("\n"); return 0; } //12 33 21 4 5 6 7 23 123 44
相关文章推荐
- 一步一步复习数据结构和算法基础-循环链表
- 一步一步复习数据结构和算法基础-KMP算法
- 一步一步复习数据结构和算法基础-稀疏矩阵基本操作
- 一步一步复习数据结构和算法基础-中序线索二叉树
- 一步一步复习数据结构和算法基础-后序线索二叉树
- 一步一步复习数据结构和算法基础-图的创建和基本操作(邻接矩阵)
- 一步一步复习数据结构和算法基础-哈希表的链地址表示
- 一步一步复习数据结构和算法基础-栈和队列(1)
- 一步一步复习数据结构和算法基础-prim算法(最小生成树)
- 一步一步复习数据结构和算法基础-插入排序(1)
- 一步一步复习数据结构和算法基础-线性表
- 一步一步复习数据结构和算法基础-单链表冒泡排序
- 一步一步复习数据结构和算法基础-层次建立层次遍历二叉树
- 一步一步复习数据结构和算法基础-LSD基数排序
- 一步一步复习数据结构和算法基础-深度优先搜索
- 一步一步复习数据结构和算法基础-冒泡排序
- 一步一步复习数据结构和算法基础-Floyd算法
- 一步一步复习数据结构和算法基础-顺序串
- 一步一步复习数据结构和算法基础-链式队列
- 一步一步复习数据结构和算法基础-插入排序(2)