在二叉搜索树中插入一个元素使停止工作

时间:2018-04-15 13:41:33

标签: c binary-search-tree

当我调用insert(element)函数并添加元素时,它会在程序停止工作时出错。 当我在root的左边添加第3个元素或在root的右侧添加元素时,它会出错。

请帮忙解决。

 void insert(int iElement){
        if(sRoot==NULL){         //Initially sRoot is NULL
            sRoot=(struct Node*)malloc(sizeof(struct Node));
            sRoot->iData=iElement;
            sRoot->sLeft=NULL;
            sRoot->sRight=NULL;
        }
        else{
            struct Node *current=(struct Node*)malloc(sizeof(struct Node));
            current->iData=iElement;
            current->sLeft=NULL;
            current->sRight=NULL;
            struct Node *parent;
            struct Node *temp;
            parent=sRoot;
            while(parent!=NULL){
                temp=parent;
                if(iElement>parent->iData){
                    parent=parent->sRight;
                }
                if(iElement<parent->iData){
                    parent=parent->sLeft;
                }
            }
            if(iElement<temp->iData)
                temp->sLeft=current;
            else
                temp->sRight=current;
        }
    }

2 个答案:

答案 0 :(得分:1)

函数中有两个错误,第一个是循环中使用了两个if语句而不是if-else if语句。


    With a AS (
       SELECT id, name from Nesting 
     )
SELECT id, name, ParentName from a OUTER APPLY ( SELECT name as ParentName from Nesting n where n.parentid = a.id
) AS FOO

因此,如果执行了第一个if语句,那么 while(parent!=NULL){ temp=parent; if(iElement>parent->iData){ parent=parent->sRight; } if(iElement<parent->iData){ parent=parent->sLeft; } } 可以设置为parent。但是,在第二个语句中,您尝试访问数据成员NULL以获取此类iData指针。

所以必须至少

NULL

此循环的第二个问题是,如果used将提供重复值,则此循环将是无限的,因为指针 while(parent!=NULL){ temp=parent; if(iElement>parent->iData){ parent=parent->sRight; } else if(iElement<parent->iData){ parent=parent->sLeft; } } 未更改。

此外还会有内存泄漏,因为已经为指针parent分配了内存,尽管在重复值的情况下不应附加任何节点。

因此,当用户提供重复值时,您需要处理该案例。

该功能可以按照以下方式实施,如演示程序中所示。

current

考虑到当函数依赖于全局变量时,这是一个坏主意。

因此最好将其声明为另外一个参数

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

struct Node
{
    int iData;
    struct Node *sLeft;
    struct Node *sRight;
};

struct Node *sRoot = NULL;

int insert( int iElement )
{
    int success = 1;
    struct Node **current = &sRoot;

    while ( success && *current != NULL )
    {
        if ( iElement < ( *current )->iData )
        {
            current = &( *current )->sLeft;
        }
        else if ( ( *current )->iData < iElement )
        {
            current = &( *current )->sRight;
        }
        else
        {
            success = 0;
        }
    }

    if ( success )
    {
        *current = malloc( sizeof( struct Node ) );
        success = *current != NULL;

        if ( success )
        {
            ( *current )->iData = iElement;
            ( *current )->sLeft = NULL;
            ( *current )->sRight = NULL;
        }
    }

    return success;
}

int main(void) 
{

    insert( 10 );
    insert( 9 );
    insert( 11 );
    insert( 12 );
    insert( 8 );
    insert( 7 );

    return 0;
}

答案 1 :(得分:0)

这是修改过的,我在评论中保留的解释。

void insert(int iElement){
        if(sRoot==NULL){         //Initially sRoot is NULL
                sRoot=(struct Node*)malloc(sizeof(struct Node));
                sRoot->iData=iElement;
                sRoot->sLeft=NULL;
                sRoot->sRight=NULL;
        }
        else{
                struct Node *current=(struct Node*)malloc(sizeof(struct Node));
                current->iData=iElement;
                current->sLeft=NULL;
                current->sRight=NULL;
                struct Node *parent;
                struct Node *temp;
                parent=sRoot;
                while(parent!=NULL){ /* it fails when parent is NULL */
                        if(iElement > parent->iData){
                                if(parent->sRight ! = NULL)/* need to check if parent->right is null or not */
                                        parent->sRight = current;/*if not NULL then put i
t here */
                                else
                                        parent = parent->sRight;/* update the parent */
                        }
                        if(iElement < parent->iData){
                                if(parent->sLeft ! = NULL)
                                        parent->sLeft = current;
                                else
                                        parent=parent->sLeft;
                        }
                }
        }
}