二叉排序树BST

二叉排序树BST 原则就是小的话接左边,大的话接右边,必须说的是效率太低主要是刚开始理解错了不需要再写什么Creat函数的,直接搜着插着就能进行可怜可怜

#include<stdio.h> #include<malloc.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define NULL 0 typedef int ElemType; typedef int Status; typedef int KepType; typedef struct BiTNode{ ElemType data; struct BiTNode * lchild, * rchild; }BiTNode, * BiTree; Status SearchBST(BiTree T, int key, BiTree f, BiTree &p){ //此次查找是为Insert做准备 //在根指针T所指的二叉树中递归地查找其关键字等于key的数据元素,若成功, // 则指针p指向该数据元素结点,并返回TRUE,否则指针p指向查找路径上访问的 //最后一个结点并返回FALSE,指针f指向T的双亲,其初始调用值为NULL if(!T) { p=f; return FALSE; } //查找不成功 else if (key==T->data) { p=T; return TRUE; } //查找成功 else if(key < T->data) return SearchBST(T->lchild, key, T, p); //在左子树中继续查找 else if(key > T->data) return SearchBST(T->rchild, key, T, p); //在右子树中继续查找 } Status InsertBST(BiTree &T, ElemType e){ //当二叉排序树T中不存在关键字等于e的数据元素时,插入e并返回TRUE,否则返回FALSE BiTree p=NULL; if(!SearchBST(T, e, NULL, p)) { BiTree s; s=(BiTree)malloc(sizeof(BiTNode)); s->data = e; s->lchild = s->rchild = NULL; if(!p) T = s; //被插结点*s为新的根结点 else if(e < p->data) p->lchild = s; else if(e > p->data) p->rchild = s; return TRUE; } else return FALSE; } Status DeleteBST(BiTree &p){ //从二叉排序树中删除结点p,并重接它的左或右子树 BiTree q; if(!p->rchild) //右子树空则只用接左子树 { q=p; p=p->lchild; free(q); } else if(!p->lchild) //左子树空则只用接右子树 { q=p; p=p->rchild; free(q); } else //左右均不空 { BiTree s; q=p; s=p->lchild; while(s->rchild) { q=s; s=s->rchild; } p->data=s->data; if(q != p) q->rchild = s->lchild; else q->lchild = s->lchild; } return OK; } Status InOrderTraverse(BiTree T) //中序递归遍历 { if(T) { InOrderTraverse(T->lchild); printf("%d ",T->data); InOrderTraverse(T->rchild); } return OK; } int main() { BiTree T=NULL; int e; int num; printf("输入初始的结点数:\n"); scanf("%d", &num); while(num--) { scanf("%d",&e); InsertBST(T,e); } InOrderTraverse(T); printf("\n"); printf("输入要插入的数据个数:\n"); scanf("%d", &num); while(num--) { scanf("%d", &e); InsertBST(T,e); } InOrderTraverse(T); printf("\n"); DeleteBST(T); InOrderTraverse(T); printf("\n"); return 0; }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值