码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构 二叉排序树 操作及实现

时间:2017-06-27 18:42:33      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:删除元素   位置   循环   stream   std   amp   --   node   插入   

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef  struct Bitnode
{
    int data;
    struct Bitnode *lchild,*rchild;
} Bitnode,*Bitree;
int Searchtree(Bitree T,int num,Bitree F,Bitree &P)   //在二叉树T种查找元素num  F表示前驱  P表示num元素所在的节点
{
    if(T==NULL)               //未找到该元素
    {
        P=F;                  //p表示num元素应当在的位置的前驱
        return 0;
    }
    else if(T->data==num)
    {
        P=T;
        return 1;
    }
    else if(T->data<=num)
        Searchtree(T->rchild,num,T,P);
    else
        Searchtree(T->lchild,num,T,P);
}
void print_in(Bitree &T)        //中序遍历排序二叉树
{
    if(T!=NULL)
    {
        print_in(T->lchild);
        printf("%d ",T->data);
        print_in(T->rchild);
    }
    return;
}
void insertTree(Bitree &T,int num)  //在二叉排序树T中插入元素NUM
{
    Bitree P,s;
    int flag=Searchtree(T,num,NULL,P);
    if(flag==0)
    {
        s=(Bitree)malloc(sizeof(Bitnode));
        s->data=num;
        s->lchild=NULL;
        s->rchild=NULL;
        if(T==NULL)
            T=s;
        else if(num<P->data)
            P->lchild=s;
        else
            P->rchild=s;
    }
    return;
}
void deletenode(Bitree &T)  //删除该节点
{
    Bitree q,s;
    if(T->rchild==NULL)
    {
        q=T;
        T=T->lchild;
        free(q);
    }
    else if(T->lchild==NULL)
    {
        q=T;
        T=T->rchild;
        free(q);
    }
    else
    {
        q=T;
        s=q->lchild;
        while(s->rchild)
        {
            q=s;
            s=s->rchild;
        }
        T->data=s->data;
        if(T==q)                            //T=q 表示 while循环没有运行  T的左儿子的右子树没有节点
            q->lchild=s->lchild;
        else
            q->rchild=s->lchild;
        free(s);
    }
    return;
}
void Deletetree(Bitree &T,int num)  //在树种删除元素num
{
    if(T==NULL)
        return;
    if(T->data<num)
        Deletetree(T->rchild,num);
    else  if(T->data>num)
        Deletetree(T->lchild,num);
    else                   //找到同样的节点 删除节点操作
    {
     //   cout<<111<<endl;
        deletenode(T);
    }
    return;
}
int main()
{
    int m,n,k;
    int a;
    Bitree T=NULL;
    Bitree q;
    int i,j;
    printf("输入n个元素和k次查找操作和m次删除操作:\n");
    scanf("%d%d%d",&n,&k,&m);
    while(n--)
    {
        int num;
        scanf("%d",&num);
        insertTree(T,num);
    }
    printf("中序遍历结果\n");
    print_in(T);
    cout<<endl;
    while(k--)
    {
        printf("请输入要查找的元素:\n");
        scanf("%d",&a);
        int ans=Searchtree(T,a,NULL,q);
        cout<<ans<<endl;
    }
    while(m--)
    {
        printf("请输入要删除的元素:\n");
        scanf("%d",&a);
        Deletetree(T,a);
        print_in(T);
        cout<<endl;
    }
    return 0;
}
測试数据:
8 3 3
5 7 8 9 10 15 3 1
9 2 5
10 1 15

数据结构 二叉排序树 操作及实现

标签:删除元素   位置   循环   stream   std   amp   --   node   插入   

原文地址:http://www.cnblogs.com/clnchanpin/p/7086424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!