首页新闻找找看学习计划

二叉排序树的建立

0
悬赏园豆:30 [待解决问题]

我在用c编写一个二叉排序树,但有个问题,尝试了很久,始终感到很迷惑,求大神解救!!

1. 有问题的程序

/*
二叉排序树:
    性质:1.左子树上所有节点的值都小于根节点的值
          2.右子树上所有节点的值都大于根节点的值
          3.左右子树也分别为二叉排序树

*/

# include <stdio.h>
# include <malloc.h>

//定义二叉树
typedef struct BiNode
{
    int data;   //数据域
     struct BiNode * left;  //指向左孩子
     struct BiNode * right;  //指向右孩子
}BiNode, * BiTree;

//在二叉排序树T上查找元素key,返回该节点的指针
bool SearchBST(BiTree T, int key, BiTree &parent)
{     //在二叉排序树T上查找key, 找到了,则返回true
                              //没有找到,则返回true,并返回双亲的指针parent

    if(NULL == T)    //没有找到
    {
        return false;
    }

    printf("%d\n", T->data);

    if(key == T->data)   //找到key元素
    {
        return true;
    }

    else if(key < T->data)   //key值小于根节点的值,在左子树上查找
        return SearchBST(T->left, key, T);

    else       //key值大于根节点的值,在右子树上查找
    {
        return SearchBST(T->right, key, T); 
    }

}

//向二叉排序树上插入元素key
void insertBST(BiTree &T, int key)
{
    BiTree parent = NULL;

    //建立新节点
    BiTree NewNode = (BiTree)malloc(sizeof(BiNode));

    NewNode->data = key;
    NewNode->left = NULL;
    NewNode->right = NULL;

    if(T == NULL)   //树为空时
        T = NewNode;

    //先查找key元素是否在树T上
    //如果不在,则把新元素插在parent后面    
    else
    {
        printf("%d\n", T->data);  //打印根节点

        if(!SearchBST(T, key, parent))
        {        
            printf("*parent = %d\n", parent->data); //????????调试的时候,发现错误出现在这,
                                                    //parent的值没有传回来,用的是引用类型啊???为什么

            if(key < parent->data)      //新节点挂在双亲后面
                parent->left = NewNode;
            else
                parent->right = NewNode;

        }
    }
        
}


int main(void)
{
    int Arr[5] = {5,9,6,7,4};
    int i;
    BiTree T = NULL;  //二叉树的根节点

    for(i = 0; i < 5; i++)
        insertBST(T,Arr[i]);  //插入元素 
    
    return 0;
}

2.下面的程序可以,那上面的程序问题出现在哪呢?

/*
二叉排序树:
    性质:1.左子树上所有节点的值都小于根节点的值
          2.右子树上所有节点的值都大于根节点的值
          3.左右子树也分别为二叉排序树

*/

# include <stdio.h>
# include <malloc.h>

//定义二叉树
typedef struct BiNode
{
    int data;   //数据域
    struct BiNode * left;  //指向左孩子
    struct BiNode * right;  //指向右孩子
}BiNode, * BiTree;

//在二叉排序树T上查找元素key,返回该节点的指针
bool SearchBST(BiTree T, int key, BiTree parent, BiTree &p)
{     //在二叉排序树T上查找key, 找到了,则返回true
                              //没有找到,则返回true,并返回双亲的指针parent

    if(NULL == T)    //没有找到
    {
        p = parent;    //p指向双亲parent
        return false;
    }

    printf("%d\n", T->data);

    if(key == T->data)   //找到key元素
    {
        return true;
    }

    else if(key < T->data)   //key值小于根节点的值,在左子树上查找
        return SearchBST(T->left, key, T, p);

    else       //key值大于根节点的值,在右子树上查找
    {
        return SearchBST(T->right, key, T, p); 
    }

}

//向二叉排序树上插入元素key
void insertBST(BiTree &T, int key)
{
    BiTree parent = NULL;
    BiTree p = NULL;

    //建立新节点
    BiTree NewNode = (BiTree)malloc(sizeof(BiNode));

    NewNode->data = key;
    NewNode->left = NULL;
    NewNode->right = NULL;

    if(T == NULL)   //树为空时
        T = NewNode;

    //先查找key元素是否在树T上
    //如果不在,则把新元素插在parent后面    
    else
    {
        printf("%d\n", T->data);  //打印根节点

        if(!SearchBST(T, key, parent, p))  //没有找到,则插入
        {        
            printf("*p = %d\n", p->data); 
            if(key < p->data)      
                p->left = NewNode;
            else
                p->right = NewNode;

        }
    }
        
}


int main(void)
{
    int Arr[5] = {5,9,6,7,4};
    int i;
    BiTree T = NULL;  //二叉树的根节点

    for(i = 0; i < 5; i++)
        insertBST(T,Arr[i]);  //插入元素 
    
    return 0;
}
214149306的主页 214149306 | 初学一级 | 园豆:3
提问于:2015-09-09 21:19
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册