递归实现二叉搜索树建立

写了个代码,然而就是运行崩溃,各种调试半天,发现还是不知道哪里错了

不抱希望的百度了下,发现网上竟然有典型错我与我的代码一样,唉。转载如下

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

typedef struct NODE
{
    NODE * pleft;
    NODE * pright;
    int ivalue;
} node;

/*  错误示例,实际上这个函数并没有连接起新建的结点

void insert_bitree(node *pt, int value)
{

    if(pt == NULL)
    {
        pt = (node *) malloc ( sizeof(node) );
        pt->ivalue = value;
        pt->pleft = NULL;
        pt->pright = NULL;
        return ;
    }
    else if( value < pt->ivalue)
    {
        insert_bitree(pt->pleft, value);   
    }
    else
    {
        insert_bitree(pt->pright, value);
    }

}

*/



void insert_bitree(node **ppt, int value) //递归方式1
{

    if(*ppt == NULL)
    {
        *ppt = (node *) malloc ( sizeof(node) );
        (*ppt)->ivalue = value;
        (*ppt)->pleft = NULL;
        (*ppt)->pright = NULL;
        return ;
    }
    else if( value < (*ppt)->ivalue)
    {
        insert_bitree(&((*ppt)->pleft), value); //将指向指针的指针重定位到当前结点的pleft
    }
    else
    {
        insert_bitree(&((*ppt)->pright), value); //将指向指针的指针重定位到当前结点的pright
    }

}







node* create_searchtree(node *t, int  temp)   //递归方式2
{  
    if (t == NULL) {    // 若当前树为空  
        t = (node *)malloc(sizeof(node) * 1);  
        if (t == NULL) {  
            printf("内存分配失败!\n");  
            exit(EXIT_FAILURE);  
        }  
        t->ivalue = temp;  
        t->pleft = NULL;  
        t->pright = NULL;  
    }else if (t->ivalue  > temp) {   // 如果比当前结点小,则插入左子树  
        t->pleft = create_searchtree(t->pleft, temp);  
    }else if (t->ivalue < temp){    // 如果比当前结点大,则插入右子树  
        t->pright = create_searchtree(t->pright, temp);  
    }  
   
    return t;  
} 



node * creat_bitree(int value[], int len) //非递归方式
{
    int i, flag;

    node *before;
    node *tmp;
    node *pt = (node *)malloc( sizeof(node) );

    
    
    pt->ivalue = value[0];
    pt->pleft = pt->pright = NULL;
    
    

    flag = 0;
    for(i = 1; i < len; i++)
    {
        tmp = pt;
        while(tmp != NULL)
        {
            if ( value[i] < (tmp)->ivalue)
            {
                before = tmp; // 存储当前结点的位置
                flag = -1;  //标志位,表明向左子树探索
                tmp = (tmp)->pleft;
                
                
            }
            else
            {
                before = tmp;
                flag = 1;
                tmp = tmp->pright;
            }



        }
        
            if(flag == -1) //将输入值插入当前结点的左子树
            {
                before->pleft = (node *) malloc (sizeof(node) );
                before->pleft->ivalue = value[i];
                before->pleft->pleft = before->pleft->pright = NULL;
            }
            else if( flag == 1)
            {

                before->pright = (node *) malloc (sizeof(node) );
                before->pright->ivalue = value[i];
                before->pright->pleft = before->pright->pright = NULL;
            }
        
        
    }

    return pt;

}


void preorder(node *pt)  //先序访问二叉树
{
    if(pt != NULL)
    {
        printf("%d\n", pt->ivalue);
        preorder(pt->pleft);
        preorder(pt->pright);
    }
}

void postorder(node *pt)
{
    if(pt != NULL)
    {
        postorder(pt->pleft);
        postorder(pt->pright);
        printf("%d\n", pt->ivalue);
    }
}


int main()
{

    
    int a[8] = {1, 2, 7, 4, 5, 19, 9, 3};
    int len = sizeof(a) / sizeof(int);





#if 1
    int i;
    node *pt = (node *)malloc(sizeof(node));
    assert(pt != NULL);
    pt->ivalue = a[0];
    pt->pleft = pt->pright = NULL;
    for(i = 1; i < 8; i++)
    {

        //pt = create_searchtree(pt, a[i]);
        insert_bitree(&pt, a[i]);


    }
#else 

    node *pt = creat_bitree(a, len);

#endif


    preorder(pt);

    return 0;
}

源代码来自于: 点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值