c语言链表创建递归,递归创建二叉树c语言实现+详细解释
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
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语言实现+详细解释相关推荐
- 用c语言链表做一个词典,电子字典C语言链表版
#define _CRT_SECURE_NO_WARNINGS #include #include #include #include struct dict { char *key; char *c ...
- c语言链表排序新增头指针法,C语言链表头插法,尾插法,排序
题目描述 火车站要组装一列动车.每列车厢有车厢编号.座位数和座位等级.现在请你把它们组装起来,要求按照车厢号码升序排列,并输出每列车厢的信息.请使用链表来实现. 输入 输入有多组. 每组有多行.第一行 ...
- c语言实现分治法求第K大元素(详细解释)
注:本文不对快速排序作任何解释,建议在对快速排序有一定了解后再阅览 一.问题分析 最简单的做法应该是直接选择先将集合排序(比如快速排序),然后直接以k为下标从有序集合中获取.但是这样做时间复杂度其实是 ...
- C语言有序数组转为平衡的二叉树(附完整源码)
C语言有序数组转为平衡的二叉树 C语言有序数组转为平衡的二叉树完整源码(定义,实现,main函数测试) C语言有序数组转为平衡的二叉树完整源码(定义,实现,main函数测试) #include< ...
- c语言中关闭文件的作用,【C语言】计算机中的流和文件概述(文件的概念及打开关闭)...
[C语言]计算机中的流和文件概述(文件的概念及打开关闭) [C语言]计算机中的流和文件概述(文件的概念及打开关闭) 目录 一.计算机中流 二.文件 1.文件的概念 2.文件的分类 3.文件的缓冲区 4 ...
- 二叉树创建,递归遍历,非递归遍历
二叉树 博主是一个大一刚刚放暑假的大学生,大学我们只学习了c语言,现在这么卷只学c语言肯定不够,所以博主打算从零开始恶补c++顺便写文章记录一下,另外博主这个暑假还想记录一些算法基础内容欢迎关注哦.这 ...
- C 语言 链表的创建与打印
C 语言 链表的创建与打印 /* 包含的头文件 */#include <stdio.h>#include <stdlib.h>/* 定义一个表示链表的结构体指针 */struc ...
- 使用C语言链表创建学生信息并且将信息打印输出
C语言文章更新目录 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C语言基础-第一个C程序 C语言基础-简单程序分 ...
- C语言 链表创建及操作
C语言 链表创建及操作 第一部分构建链表,定义结构体,分别用头插法.尾插法实现,这里封装了打印函数:printf();做练习方便后续使用:对链表进行查找,并将查找到的值构建一个新的链表:链表的转置:具 ...
- c语言线索二叉树作用,C语言递归实现线索二叉树
本文实例为大家分享了C语言递归实现线索二叉树的具体代码,供大家参考,具体内容如下 描述:将二叉树中结点的空左孩子指针域指向前驱结点,将空的右孩子指针域指向后继结点. code: #pragma war ...
最新文章
- python找出函数最小值极其对应的自变量的值
- AWS 开源 SageMaker,帮助开发人员优化机器学习模型
- python爬虫教程视频-13天搞定Python分布爬虫
- 转:Linux实时将所有输出重定向到文件
- python二维高斯分布生成_python 多维高斯分布数据生成方式
- error C2143: syntax error : missing ‘;’ before ‘type’
- Oracle官方并发教程之不可变对象
- 集群间动态扩展和删除hdfs的datanode和hbase的regionserver
- Zabbix监控网络设备讲解
- 8.企业应用架构模式 --- 通盘考虑
- Expression Tree 扩展MVC中的 HtmlHelper 和 UrlHelper
- WIN7系统下Mapgis6.7常见的两个问题及解决办法
- 清风数学建模学习笔记——TOPSIS法(优劣解距离法)
- kindeditor 上传图片 php,Kindeditor编辑器添加图片上传水印功能(php代码)
- VGG16-keras 优化
- 使用PR剪辑视频,mkv格式怎么无损转mp4
- 四、守护线程 deamon
- 【数理逻辑三】命题逻辑及形式系统【上】
- 深度强化学习(机器之心)
- 移动商务进入战国时代 08年市场规模达306.5亿
热门文章
- php-fpm 进程通讯,PHP-FPM进程模型解析
- java类和接口实例_Java定义泛型接口和类的方法实例分析
- tf.data.Dataset.from_tensor_slices 的用法
- python 自带虚拟环境
- python 获取当前时间和日期
- typora行内公式怎么显示不了,怎么办?
- 十一、递归----迷宫问题
- 越线人群计数--Crossing-line Crowd Counting with Two-phase Deep Neural Networks
- Java调用PHP,跑PHP代码
- Spring Cloud Alibaba 系统保护:微服务架构雪崩效应与服务限流