| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 291 人关注过本帖
标题:二叉排序树
只看楼主 加入收藏
EndingWu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-4-6
结帖率:100%
收藏
 问题点数:0 回复次数:0 
二叉排序树
给出一个数据序列,建立二叉排序树,并实现删除功能

对二叉排序树进行中序遍历,可以得到有序的数据序列
#include <iostream>
using namespace std;
#define Maxsize 25


struct BiNode{
    int data;   
    struct BiNode *lchild,*rchild;
};
struct BiNode *root;
int BisCount;
int BisPos;
int BisSuccess;
BiNode *NextBiNode;BiNode *q;BiNode *l;
void InsertNode(BiNode *root,BiNode *s)
{
    if(s->data<root->data)
    {
        if(!root->lchild==NULL)
            InsertNode(root->lchild,s);
        else
        {
            root->lchild=s;
            return;
        }
    }
    else
    {
        if(!root->rchild==NULL)
            InsertNode(root->rchild,s);
        else
        {
            root->rchild=s;
            return;
        }
    }
}
void CreateBST(int *r,int n)
{
    int i;
    BiNode *s;
    root->data=r[0];
    root->lchild=root->rchild=NULL;
    for(i=1;i<n;i++)
    {
        s=new BiNode;
        s->data=r[i];
        s->lchild=s->rchild=NULL;
        InsertNode(root,s);
    }
}

BiNode *SearchNode(BiNode *root,int k)
{
   
    BisCount++;
    if(root->data==k)
    {
        BisSuccess=1;
        return root;
    }
    else
    {
        if(root->data>k)
        {
            BisPos=2*BisPos-1;
            NextBiNode=root->lchild;
        }
        if(root->data<k)
        {
            BisPos=2*BisPos;
            NextBiNode=root->rchild;
        }
    }
    if(NextBiNode !=NULL)
        return SearchNode(NextBiNode,k);
    else
    {
        BisSuccess=0;
        BisCount++;

        BiNode *s;s=new BiNode;
        s->data=k;
        s->lchild=s->rchild=NULL;
        InsertNode(root,s);
        return NULL;
    }
}
int DeleteNode(BiNode* &p)
{

    if(!p->rchild)
    {
        q=p;
        p=p->lchild;
        delete q;
    }
    else if(!p->lchild)
    {
        q=p;
        p=p->rchild;
        delete q;
    }
    else
    {
        q=p;l=p->lchild;
        while(l->rchild)
        {
            q=l;
            l=l->rchild;
        }
        p->data=l->data;
        if(q!=p)
            q->rchild=l->lchild;
        else
            q->lchild=l->lchild;
        delete l;
    }        

    return 1;   
}
void InOrder(BiNode *bt)
{
    if(bt==NULL)
        return;
    else{      
        InOrder(bt ->lchild);   
        cout<<bt->data<<" ";
        InOrder(bt ->rchild);
    }
}
int SearchBST(int k)
{
    BisCount=0;
    BisPos=1;
    if(root->data==NULL)
    {
        BisSuccess=0;
        return 0;
    }
    SearchNode(root,k);
    return BisSuccess;
}
int DeleteBST(BiNode* root,int k)
{

    if(!root)
        return 0;
    else
    {
        if(root->data==k)
            return  DeleteNode(root);
        else if(k<root->data)
            return  DeleteBST(root->lchild,k);
        else
            return  DeleteBST(root->rchild,k);   
    }
}


int main()
{

    int t;
    cin>>t;
    while(t--)
    {
        int n,i,m,k;
        int a[20];
        cin>>n;
        for(i=0;i<n;i++)
            cin>>a[i];
        root=new BiNode;
        CreateBST(a,n);
        InOrder(root);
        cout<<endl;



        cin>>m;
        for(i=0;i<m;i++)
        {
            cin>>k;
            DeleteBST(root,k);
            InOrder(root);
   
            cout<<endl;
        }
    }
    return 0;
}


肯定是delete这一部分出问题了
调试的时候卡在了中序遍历那 貌似是删除后的节点有残留一样的 然后排序就出错了;
ps:试着输入22 33 55 66 11 44 中序遍历的结果是11 22 33 44 55 66;
求大神帮我看看delete那一部分哪里出问题 我实在是找不出错误在哪里!
搜索更多相关主题的帖子: include 
2014-12-15 21:49
快速回复:二叉排序树
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028992 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved