首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

二叉排序树的生成和插入,诚心100分,懂c数据结构二叉树的进

2012-09-08 
二叉排序树的生成和插入,诚心100分求救,懂c数据结构二叉树的进C/C++ code#include stdlib.h#include st

二叉排序树的生成和插入,诚心100分求救,懂c数据结构二叉树的进

C/C++ code
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h>typedef int DataType;typedef struct Node {    DataType key;    struct Node *lchild, *rchild;}BSTNode;typedef BSTNode *BSTree;void insert(BSTree *T , DataType key){    BSTNode *f,*p = *T;    while ( p != NULL ){  /*不为空则寻找插入点*/        if ( p->key == key ) return;        f = p ;        p =  key < p->key ? f->lchild : f->rchild ;    }    /*插入*/    p = (BSTNode*)malloc(sizeof(BSTNode));    p->key = key;                                                                                if( *T == NULL ){        *T = p ;        }else{        if (key < f->key){            f->lchild = p;            }else {            f->rchild = p;        }    }}/*显示右子树,也就是显示最右边一斜线那些最右分支*/void right_show(BSTree *T){    BSTNode *p = *T ;    printf("%d",(*T)->key);    while( p != NULL ){        p = p->rchild;        printf("%d",p->key);    }}void main(){    int i = 1 ;    BSTree T = NULL ;    printf("start");    /*简单地形成单条右子树,这么简单还是插入有误,什么情况呀,求救 ,救命啊!!!*/    for(i = 1 ; i<=10 ; i++ ){        insert(&T ,i);    }        right_show(&T);}


[解决办法]
每个节点申请后都要初始化左右子结点指针

顺便,学编程在学完helloworld之后就该学单步调试。
一百行的代码还可能肉眼挑错,一千行一万行的代码没人有那个精力去检查哪里漏了什么。
不会单步调试就不要编程,这类简单的错误压根就不要找别人。
[解决办法]
if( *T == NULL ){
*T = p ;
}

这里应该是T = p;
你的新加入节点的lchild和rchild都没有初始化,在判断的时候难道一定是NULL??
逻辑还是有很多问题。。
你插入节点的时候,最好有个生成节点的函数,并初始化节点。


[解决办法]
4楼的正解
[解决办法]
正解个头

BSTree *T
T是BSTree*类型,也就是BSTNode**类型,*T=p有问题?
几位好自为之。
[解决办法]
探讨

正解个头

BSTree *T
T是BSTree*类型,也就是BSTNode**类型,*T=p有问题?
几位好自为之。

[解决办法]
探讨

没看仔细。是的
LZ是用了二级指针,完全没必要。。

[解决办法]
1. 创建的时候树的两个子节点没有初始化. 不要以为 malloc 出来的地址默认填 0 了, 默认是随机的.

C/C++ code
        /*插入*/    p = (BSTNode*)malloc(sizeof(BSTNode));    p->key = key;        /* >>>> 还有两个指针没有初始化 */    p->lchild = p->rchild = NULL;        if( *T == NULL ){        ....
[解决办法]
估计还是初始化的问题。插入节点后,该节点的左右子节点没初始化,下次插入时,在这个节点下面的话,判断whi(p!=NULL)时,可能出错。

热点排行