该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

void CreatBiTree(BiTree T)

{

char a;

scanf("%c",&a);

if(a=='@')

T=NULL;

else

{

T=(BiTree)malloc(sizeof(BiNode));

T->data=a;

CreatBiTree(T->lchild);

CreatBiTree(T->rchild);

}

}

虽能编译,但不能正确运行,冥思苦想n小时,未果

遂改其为

BiTree CreatBiTree()

{

char a;

BiTree T;

scanf("%c",&a);

if(a=='@')

T=NULL;

else

{

T=(BiTree)malloc(sizeof(BiNode));

T->data=a;

T->lchild=CreatBiTree();

T->rchild=CreatBiTree();

}

return T;

}

不再用传递参数,用返回值,正确编译运行,喜。

重审前程序,改为

void CreatBiTree(BiTree *T)

{

char a;

scanf("%c",&a);

if(a=='@')

*T=NULL;

else

{

*T=(BiTree)malloc(sizeof(BiNode));

(*T)->data=a;

CreatBiTree(&((*T)->lchild));

CreatBiTree(&((*T)->rchild));

}

}

正确编译运行,惑。

又冥思苦想n小时,终于悟出其中原由(好象多难似的,或者其实是我太愚钝)

原来还是对指针的理解不够深刻

最开始的程序传递的是Node型结构体的指针,于是在函数中会生成一个形参也指向这个结构体,但在函数中有一句T=(BiTree)malloc(sizeof(BiNode)); 改变了形参的指向,以后再对形参的任何操作不会在主函数中的T产生影响。

下面是两个完整的程序,分别用的两种建树方法

#include "stdlib.h"

#include "conio.h"

typedef struct node

{

char data;

struct node *lchild,*rchild;

}BiNode,*BiTree;

BiTree CreatBiTree()

{

char a;

BiTree T;

scanf("%c",&a);

if(a=='@')

T=NULL;

else

{

T=(BiTree)malloc(sizeof(BiNode));

T->data=a;

T->lchild=CreatBiTree();

T->rchild=CreatBiTree();

}

return T;

}

void PreOrderTraverse(BiTree T)

{

if(T)

{

printf("%c",T->data);

PreOrderTraverse(T->lchild);

PreOrderTraverse(T->rchild);

}

}

void InOrderTraverse(BiTree T)

{

if(T)

{

InOrderTraverse(T->lchild);

printf("%c",T->data);

InOrderTraverse(T->rchild);

}

}

void PostOrderTraverse(BiTree T)

{

if(T)

{

PostOrderTraverse(T->lchild);

PostOrderTraverse(T->rchild);

printf("%c",T->data);

}

}

main()

{

BiTree T;

clrscr();

T=CreatBiTree();

PreOrderTraverse(T);

printf("\n");

InOrderTraverse(T);

printf("\n");

PostOrderTraverse(T);

}

#include "stdlib.h"

#include "conio.h"

typedef struct node

{

char data;

struct node *lchild,*rchild;

}BiNode,*BiTree;

void CreatBiTree(BiTree *T)

{

char a;

scanf("%c",&a);

if(a=='@')

*T=NULL;

else

{

*T=(BiTree)malloc(sizeof(BiNode));

(*T)->data=a;

CreatBiTree(&((*T)->lchild));

CreatBiTree(&((*T)->rchild));

}

}

void PreOrderTraverse(BiTree T)

{

if(T)

{

printf("%c",T->data);

PreOrderTraverse(T->lchild);

PreOrderTraverse(T->rchild);

}

}

void InOrderTraverse(BiTree T)

{

if(T)

{

InOrderTraverse(T->lchild);

printf("%c",T->data);

InOrderTraverse(T->rchild);

}

}

void PostOrderTraverse(BiTree T)

{

if(T)

{

PostOrderTraverse(T->lchild);

PostOrderTraverse(T->rchild);

printf("%c",T->data);

}

}

main()

{

BiTree T;

clrscr();

CreatBiTree(&T);

PreOrderTraverse(T);

printf("\n");

InOrderTraverse(T);

printf("\n");

PostOrderTraverse(T);

}

更多数据结构实例http://hi.baidu.com/longzuo

c语言链表创建递归,递归创建二叉树c语言实现+详细解释相关推荐

  1. 用c语言链表做一个词典,电子字典C语言链表版

    #define _CRT_SECURE_NO_WARNINGS #include #include #include #include struct dict { char *key; char *c ...

  2. c语言链表排序新增头指针法,C语言链表头插法,尾插法,排序

    题目描述 火车站要组装一列动车.每列车厢有车厢编号.座位数和座位等级.现在请你把它们组装起来,要求按照车厢号码升序排列,并输出每列车厢的信息.请使用链表来实现. 输入 输入有多组. 每组有多行.第一行 ...

  3. c语言实现分治法求第K大元素(详细解释)

    注:本文不对快速排序作任何解释,建议在对快速排序有一定了解后再阅览 一.问题分析 最简单的做法应该是直接选择先将集合排序(比如快速排序),然后直接以k为下标从有序集合中获取.但是这样做时间复杂度其实是 ...

  4. C语言有序数组转为平衡的二叉树(附完整源码)

    C语言有序数组转为平衡的二叉树 C语言有序数组转为平衡的二叉树完整源码(定义,实现,main函数测试) C语言有序数组转为平衡的二叉树完整源码(定义,实现,main函数测试) #include< ...

  5. c语言中关闭文件的作用,【C语言】计算机中的流和文件概述(文件的概念及打开关闭)...

    [C语言]计算机中的流和文件概述(文件的概念及打开关闭) [C语言]计算机中的流和文件概述(文件的概念及打开关闭) 目录 一.计算机中流 二.文件 1.文件的概念 2.文件的分类 3.文件的缓冲区 4 ...

  6. 二叉树创建,递归遍历,非递归遍历

    二叉树 博主是一个大一刚刚放暑假的大学生,大学我们只学习了c语言,现在这么卷只学c语言肯定不够,所以博主打算从零开始恶补c++顺便写文章记录一下,另外博主这个暑假还想记录一些算法基础内容欢迎关注哦.这 ...

  7. C 语言 链表的创建与打印

    C 语言 链表的创建与打印 /* 包含的头文件 */#include <stdio.h>#include <stdlib.h>/* 定义一个表示链表的结构体指针 */struc ...

  8. 使用C语言链表创建学生信息并且将信息打印输出

    C语言文章更新目录 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C语言基础-第一个C程序 C语言基础-简单程序分 ...

  9. C语言 链表创建及操作

    C语言 链表创建及操作 第一部分构建链表,定义结构体,分别用头插法.尾插法实现,这里封装了打印函数:printf();做练习方便后续使用:对链表进行查找,并将查找到的值构建一个新的链表:链表的转置:具 ...

  10. c语言线索二叉树作用,C语言递归实现线索二叉树

    本文实例为大家分享了C语言递归实现线索二叉树的具体代码,供大家参考,具体内容如下 描述:将二叉树中结点的空左孩子指针域指向前驱结点,将空的右孩子指针域指向后继结点. code: #pragma war ...

最新文章

  1. python找出函数最小值极其对应的自变量的值
  2. AWS 开源 SageMaker,帮助开发人员优化机器学习模型
  3. python爬虫教程视频-13天搞定Python分布爬虫
  4. 转:Linux实时将所有输出重定向到文件
  5. python二维高斯分布生成_python 多维高斯分布数据生成方式
  6. error C2143: syntax error : missing ‘;’ before ‘type’
  7. Oracle官方并发教程之不可变对象
  8. 集群间动态扩展和删除hdfs的datanode和hbase的regionserver
  9. Zabbix监控网络设备讲解
  10. 8.企业应用架构模式 --- 通盘考虑
  11. Expression Tree 扩展MVC中的 HtmlHelper 和 UrlHelper
  12. WIN7系统下Mapgis6.7常见的两个问题及解决办法
  13. 清风数学建模学习笔记——TOPSIS法(优劣解距离法)
  14. kindeditor 上传图片 php,Kindeditor编辑器添加图片上传水印功能(php代码)
  15. VGG16-keras 优化
  16. 使用PR剪辑视频,mkv格式怎么无损转mp4
  17. 四、守护线程 deamon
  18. 【数理逻辑三】命题逻辑及形式系统【上】
  19. 深度强化学习(机器之心)
  20. 移动商务进入战国时代 08年市场规模达306.5亿

热门文章

  1. php-fpm 进程通讯,PHP-FPM进程模型解析
  2. java类和接口实例_Java定义泛型接口和类的方法实例分析
  3. tf.data.Dataset.from_tensor_slices 的用法
  4. python 自带虚拟环境
  5. python 获取当前时间和日期
  6. typora行内公式怎么显示不了,怎么办?
  7. 十一、递归----迷宫问题
  8. 越线人群计数--Crossing-line Crowd Counting with Two-phase Deep Neural Networks
  9. Java调用PHP,跑PHP代码
  10. Spring Cloud Alibaba 系统保护:微服务架构雪崩效应与服务限流