| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 431 人关注过本帖
标题:二叉树的右子树插入和删除出问题,不懂哪错了
只看楼主 加入收藏
布衣书生
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2011-12-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
二叉树的右子树插入和删除出问题,不懂哪错了
程序代码:
#include<stdio.h>
#include<stdlib.h>
static int n=0;
static int n1=0;
typedef struct bitnode
{
    int data;
    struct bitnode *lchild,*rchild;
}Bitnode,*Bitree;

Bitree create()                        //建立二叉树
{
    Bitree t;
    int x;
    printf("请输入结点的数据:");
    scanf("%d",&x);
    if(x==0) t=NULL;
    else 
    {
        t=(Bitnode*)malloc(sizeof(Bitnode));
        t->data=x;
        t->lchild=create();               //左孩子获得新指针值
        t->rchild=create();               //右孩子获得新指针值
    }
    return t;
}

void preorder(Bitree t)             //先序遍历二叉树
{
    if(t)
    {
    printf("%-4d",t->data);
    n++;
    if(t->lchild==NULL&&t->rchild==NULL)               //求叶子结点数
        n1++;
    preorder(t->lchild);
    preorder(t->rchild);
    }
}

Bitree insertL(Bitree bt,int x,Bitree parent)                //左孩子插入函数
{
    Bitree p;
    if(parent==NULL)
    {
        printf("插入出错\n");
        return NULL;
    }
    if((p=(Bitnode *)malloc(sizeof(Bitnode)))==NULL)
        return NULL;
    p->data=x;
    p->lchild=NULL;
    p->rchild=NULL;
    if(parent->lchild==NULL)
        parent->lchild=p;
    else
    {
        p->lchild=parent->lchild;
        parent->lchild=p;
    }
    return bt;
}

Bitree insertR(Bitree bt,int x,Bitree parent)                //右孩子插入函数
{
    Bitree p;
    if(parent==NULL)
    {
        printf("插入出错\n");
        return NULL;
    }
    if((p=(Bitnode *)malloc(sizeof(Bitnode)))==NULL)
        return NULL;
    p->data=x;
    p->lchild=NULL;
    p->rchild=NULL;
    if(parent->rchild==NULL)
        parent->rchild=p;
    else
    {
        p->rchild=parent->rchild;
        parent->rchild=p;
    }
    return bt;
}

Bitree delL(Bitree bt,Bitree parent)                //左孩子删除函数
{
    Bitree p;
    if(parent==NULL||parent->lchild==NULL)
    {
        printf("删除出错\n");
        return NULL;
    }
    p=parent->lchild;
    parent->lchild=NULL;
    free(p);
    return bt;
}

Bitree delR(Bitree bt,Bitree parent)                //右孩子删除函数
{
    Bitree p;
    if(parent==NULL||parent->rchild==NULL)
    {
        printf("删除出错\n");
        return NULL;
    }
    p=parent->rchild;
    parent->rchild=NULL;
    free(p);
    return bt;
}

Bitree search(Bitree bt,int x)                       //查找函数
{
    Bitree p;
    if(bt)
    {
        if(bt->data==x) return bt;
        if(bt->lchild)
            p=search(bt->lchild,x);
        if(p)
            return p;
        if(bt->rchild)
            p=search(bt->rchild,x);
        if(p)
            return p;
    }
    return NULL;
}

void main()
{
    int i,x,y;
    Bitree p;
    Bitree t=NULL;
    do
    {
        printf("\n");
        printf("------------------------------------------\n");
        printf("1.建立二叉树:\t\t");
        printf("2.先序遍历二叉树\n");
        printf("3.计算树中的结点个数\t");
        printf("4.左孩子插入\n");
        printf("5.右孩子插入\t\t");
        printf("6.左孩子删除\n");
        printf("7.右孩子删除\t\t");
        printf("8.结束程序运行\n");
        printf("------------------------------------------\n");
        printf("请输入1-8:");
        scanf("%d",&i);
        switch(i)
        {
        case 1:
            t=create();
            break;
        case 2:
            if(t==NULL)
            {
                printf("二叉树为空\n");
            }
            preorder(t);
            break;
        case 3:
            printf("二叉树的结点总数为:%d\n",n);
            printf("二叉树的叶子结点数为:%d\n",n1);
            break;
        case 4:
            printf("请输入所要插入结点的数据:");
            scanf("%d",&x);
            p=search(t,x); 
            printf("请输入要插入的数据:");
            scanf("%d",&y);
            t=insertL(t,y,p);
            break;
        case 5:
            printf("请输入所要插入结点的数据:");
            scanf("%d",&x);
            p=search(t,x); 
            printf("请输入要插入的数据:");
            scanf("%d",&y);
            t=insertR(t,y,p);
            break;
        case 6:
            printf("请输入所要删除左子树的结点的数据:");
            scanf("%d",&x);
            p=search(t,x); 
            t=delL(t,p);
            break;
        case 7:
            printf("请输入所要删除右子树的结点的数据:");
            scanf("%d",&x);
            p=search(t,x); 
            t=delR(t,p);
            break;
        case 8:    
            printf("—————谢谢使用—————\n");
            exit(0);
        }
    }while(i>=1&&i<8);
}








搜索更多相关主题的帖子: 二叉树 
2012-05-15 13:30
布衣书生
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2011-12-8
收藏
得分:0 
插入或者删除右子树时都会出现问题,就是运行5和7时出问题,求指导
2012-05-15 13:31
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:14 
search  函数中 p要进行初始化
2012-05-15 19:20
布衣书生
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2011-12-8
收藏
得分:0 
回复 3楼 寒风中的细雨
不是这个问题,原来是括号问题,现在解决了,谢谢
2012-05-16 21:03
快速回复:二叉树的右子树插入和删除出问题,不懂哪错了
数据加载中...
 
   



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

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