递归实现二叉搜索树建立
2016-05-14 12:30
295 查看
写了个代码,然而就是运行崩溃,各种调试半天,发现还是不知道哪里错了
不抱希望的百度了下,发现网上竟然有典型错我与我的代码一样,唉。转载如下
源代码来自于:点击打开链接
不抱希望的百度了下,发现网上竟然有典型错我与我的代码一样,唉。转载如下
#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; }
源代码来自于:点击打开链接
相关文章推荐
- Vim的使用方法
- 30分钟上手最火android网络请求框架Retrofit
- iOS开发——Cocoapods的安装和使用
- 小代码 二叉树 java1
- Window远程连接Linux系统(CentOS7)
- 团队作业之旅游行业APP分析
- Android中使用Gson解析JSON数据的方法
- SQL Server中常用的日期时间函数
- struts2 多文件上传
- gitlab webhooks:当build events触发发送的json数据格式
- 菜鸟级别的Shiro配置、使用案例(一)
- Servlet学习笔记
- Running Dubbo On Spring Boot
- split()方法字符串拆分
- spring通知-BeforeAdvice和AfterReturningAdvice
- Android Development Environment ADT-BUNDLE android-studio SDK ADT Download
- ORA-12154: TNS: 无法解析指定的连接标识符
- 玩转ptrace (一)
- Bullet Physics Engine(物理引擎)中使用约束
- eclipse + pydev 创建django项目