二叉树的递归遍历算法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语言实现+详细解释相关推荐
- 数据结构(二十)二叉树的递归遍历算法
一.二叉树的遍历的定义 1.二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问依次且仅被访问依次.树的结点之间不存在 ...
- 树:二叉树的非递归遍历算法
二叉树的递归遍历 二叉树的递归遍历算法,写法很简单,比如说前序遍历树,如下: //前序遍历 void PreOrderTraverse(BiTree tree) {if (NULL != tree){ ...
- 数据结构——二叉树的递归遍历算法与非递归遍历算法+层次遍历算法
(文章篇幅有点长,二叉树的递归遍历算法不作详细分析,但是二叉树的非递归遍历算法和层次遍历算法都有非常详细的分析过程,记得往下翻哦!) 二叉树的递归遍历算法实现 我们首先用递归的方法先序遍历创建这样一棵 ...
- 二叉树遍历算法详解(递归法+非递归法)
二叉树遍历算法详解 在上一篇C语言实现二叉树中有提到对于二叉树的遍历,包括前序,中序和后续遍历,以及层次遍历 大家已经熟悉了二叉树的前中后序遍历过程,大部分都采用了递归的思想来实现 在leetcode ...
- 实现二叉树的三种非递归遍历算法
[问题描述] 编写程序,实现二叉树的三种非递归遍历算法:先序非递归,中序非递归,后序非递归. [输入形式] 输入建树序列. [输出形式] 输出三种遍历序列. [样例输入] A B C # # # # ...
- java版 二叉树 所有递归和非递归遍历算法
[java] 通过数组构造二叉树,所有遍历算法以及求二叉树深度的递归算法 [java] import java.util.LinkedList; public class BinaryTree { ...
- 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放...
01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...
- python二叉树遍历算法_分享python实现的二叉树定义与遍历
这篇文章主要介绍了python实现的二叉树定义与遍历算法,结合具体实例形式分析了基于Python定义的二叉树及其常用遍历操作实现技巧,需要的朋友可以参考下 本文实例讲述了python实现的二叉树定义与 ...
- 树的递归与非递归遍历算法
树的递归与非递归遍历算法 树的递归与非递归遍历算法 树的遍历 实例 树遍历的口诀 树的递归遍历代码 树的先序遍历 树的中序遍历 树的后序遍历 递归遍历思想 树的非递归遍历 树的先序非递归遍历 先序遍历 ...
- C语言数据结构之线索二叉树
C语言数据结构之线索二叉树 tips:前些天学习了二叉树的相关操作,今天来总结一下线索二叉树的操作. 线索二叉树:对二叉树以某种次序遍历得到序列中的前驱和后继,其中指向结点前驱和后继的指针称为线索,再 ...
最新文章
- 2018人工智能前沿报告:深度学习的应用和价值
- C++学习路线和参考资料
- python条件替换_Python中Numpy条件替换操作一例
- 用java创建窗口程序,创建窗口的应用程序
- 08:石头剪刀布【一维数组】
- 使用solrj api操作solr
- linux VM命令下查找
- 校招行测笔试--资料分析
- 数据库课设——DMS(高校宿舍管理系统)
- heic转换成jpg,学会这个方法就够了
- SIM800C 不停的回复Call Ready NET指示灯一直不能进入3秒闪烁的状态
- 对应阻尼下的开环增益matlab,初识控制系统计算机仿真和辅助设计
- 2010 年全国大学生数学建模竞赛甘肃赛区 获奖情况
- 光电式液位传感器和电容式液位传感器的区别
- Linux系统不响应SYN包的解决办法
- 什么使格瓦拉风行至今
- 区块链能否遏制公共部门的腐败行为?
- Android Studio出现Execution failed for task ‘:app:processDebugMainManifest
- vue+d3.js计算任意多边形面积
- 事件循环(Event Loop)相关概念 及 面试题
热门文章
- 回击华为!高通:支持Sub-6GHz和毫米波双频段的5G基带才是真5G
- 2019胡润财富报告:中国大陆中产家庭3320万户
- 苹果这个酷炫的项目要流产了?市场未爆发或成主因
- 618买手机哪家强?苹果官方也来打折促销了
- 鸿海集团否认郭台铭辞任董事长:只是希望退居二线
- 任性!特斯拉又涨价了 Model S、Model X国内售价上调
- 苹果卖这么贵都怪她?苹果零售部门主管将离职 曾是奢侈品巨头掌门人
- linux网卡pci信息,在进行CGKlinux系统网络配置时,使用()命令可以查询出网卡的PCI编号与设备名的对应关系。...
- ffmpeg vaapi 驱动问题
- c函数strstr和sscanf组合高级技巧