【数据结构】——构建二叉树,遍历二叉树
二叉树的数据结构:
1 typedef struct BiTree{ 2 char item; 3 struct BiTree *lchild,*rchild; 4 }BiTree;
构建一个二叉树:
为了能让每个结点确认是否有左右孩子,我们要对二叉树进行扩展,变成上图的样子。也就是,将二叉树的每个结点的空指针引出的一个虚节点,其值为一特定值,比如“1”。我们称这种处理后的二叉树为原二叉树的扩展二叉树。
有了扩展二叉树就可以进行二叉树的构建了,笔者选择的是先序构建二叉树:
1 void CreateBiTree(BiTree **T) 2 { 3 char ch; 4 char tmp; 5 scanf("%c",&ch); 6 tmp = getchar(); 7 if(ch == '1') 8 *T = NULL; 9 else{ 10 *T = (BiTree *)malloc(sizeof(BiTree)); 11 if(!*T) 12 exit(1); 13 (*T)->item = ch; 14 CreateBiTree(&((*T)->lchild)); 15 CreateBiTree(&((*T)->rchild)); 16 } 17 }
如果是先序构建二叉树那么我们的输入顺序就应该是:“abdh11i11e11cf11g11”;输入这些数据之后就会构建上图的二叉树了;
若要中序构建二叉树可以把(*T)->item = ch;移动到CreateBiTree(&(*T)->lchild);的后面,不过输入的顺序就变成 对上图扩展二叉树的中序遍历结果了;
前序遍历二叉树:
前序遍历的规则如下:
若二叉树为空,则退出。否则
⑴访问处理根结点;
⑵前序遍历左子树;
⑶前序遍历右子树;
特点:由左而右逐条访问由根出发的树支 (回溯法的基础)
也就是一个递归的过程:
1 void alr_show(BiTree *t) 2 { 3 if(t == NULL) 4 return; 5 printf("%c\t",t->item); 6 alr_show(t->lchild); 7 alr_show(t->rchild); 8 }
中序遍历的规则:
若二叉树为空,则退出;否则
⑴中序遍历左子树;
⑵访问处理根结点;
⑶中序遍历右子树;
1 void lar_show(BiTree *t) 2 { 3 if(t == NULL) 4 return; 5 lar_show(t->lchild); 6 printf("%c\t",t->item); 7 lar_show(t->rchild); 8 }
后序遍历的规则如下:
若二叉树为空,则退出;否则
⑴后序遍历左子树;
⑵后序遍历右子树;
⑶访问处理根结点;
1 void lra_show(BiTree *t) 2 { 3 if(t == NULL) 4 return; 5 lra_show(t->lchild); 6 lra_show(t->rchild); 7 printf("%c\t",t->item); 8 }
完整的代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 //二叉树数据结构定义 5 typedef struct BiTree{ 6 char item; 7 struct BiTree *lchild,*rchild; 8 }BiTree; 9 10 void CreateBiTree(BiTree **T) 11 { 12 char ch; 13 char tmp; 14 scanf("%c",&ch); 15 tmp = getchar(); 16 if(ch == '1') 17 *T = NULL; 18 else{ 19 *T = (BiTree *)malloc(sizeof(BiTree)); 20 if(!*T) 21 exit(1); 22 (*T)->item = ch; 23 CreateBiTree(&((*T)->lchild)); 24 CreateBiTree(&((*T)->rchild)); 25 } 26 } 27 28 void alr_show(BiTree *t) 29 { 30 if(t == NULL) 31 return; 32 printf("%c\t",t->item); 33 alr_show(t->lchild); 34 alr_show(t->rchild); 35 } 36 37 void lar_show(BiTree *t) 38 { 39 if(t == NULL) 40 return; 41 lar_show(t->lchild); 42 printf("%c\t",t->item); 43 lar_show(t->rchild); 44 } 45 46 void lra_show(BiTree *t) 47 { 48 if(t == NULL) 49 return; 50 lra_show(t->lchild); 51 lra_show(t->rchild); 52 printf("%c\t",t->item); 53 } 54 int main(void) 55 { 56 BiTree *t; 57 CreateBiTree(&t); 58 printf("先序遍历二叉树\n"); 59 alr_show(t); 60 printf("\n"); 61 printf("中序遍历二叉树\n"); 62 lar_show(t); 63 printf("\n"); 64 printf("后序遍历二叉树\n"); 65 lra_show(t); 66 printf("\n"); 67 68 }
View Code
如果按照上述的方法构建二叉树,每次都要输入一个字符,如果二叉树的结点很多,那我们岂不是要输入很多的结点,稍有不注意就会把结点输错;我们可以先把需要输入的结点的顺序存储到一个数组中。然后把数组传入到构建二叉树的函数中,在构建二叉树函数中取数据,赋值给结点;我们会设计一个取数据的函数:
1 char getvalue(char *val) 2 { 3 static int i = 0; 4 return *(val + i++); 5 }
需要注意的是我们的int i,是静态的,也就是说运行程序开始就会存在文件中,修改的值会存在文件中,什么时候用都可以;
那么现在的构建二叉树的函数就变成了:
1 void CreateBiTree(BiTree **T,char *val) 2 { 3 char ch; 4 char tmp; 5 ch = getvalue(val); 6 //scanf("%c",&ch); 7 //tmp = getchar(); 8 if(ch == '1') 9 *T = NULL; 10 else{ 11 *T = (BiTree *)malloc(sizeof(BiTree)); 12 if(!*T) 13 exit(1); 14 (*T)->item = ch; 15 CreateBiTree(&((*T)->lchild),val); 16 CreateBiTree(&((*T)->rchild),val); 17 } 18 }
完整代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 //二叉树数据结构定义 5 typedef struct BiTree{ 6 char item; 7 struct BiTree *lchild,*rchild; 8 }BiTree; 9 10 char getvalue(char *val) 11 { 12 static int i = 0; 13 return *(val + i++); 14 15 } 16 17 void CreateBiTree(BiTree **T,char *val) 18 { 19 char ch; 20 char tmp; 21 ch = getvalue(val); 22 //scanf("%c",&ch); 23 //tmp = getchar(); 24 if(ch == '1') 25 *T = NULL; 26 else{ 27 *T = (BiTree *)malloc(sizeof(BiTree)); 28 if(!*T) 29 exit(1); 30 (*T)->item = ch; 31 CreateBiTree(&((*T)->lchild),val); 32 CreateBiTree(&((*T)->rchild),val); 33 } 34 } 35 36 void alr_show(BiTree *t) 37 { 38 if(t == NULL) 39 return; 40 printf("%c\t",t->item); 41 alr_show(t->lchild); 42 alr_show(t->rchild); 43 } 44 45 void lar_show(BiTree *t) 46 { 47 if(t == NULL) 48 return; 49 lar_show(t->lchild); 50 printf("%c\t",t->item); 51 lar_show(t->rchild); 52 } 53 54 void lra_show(BiTree *t) 55 { 56 if(t == NULL) 57 return; 58 lra_show(t->lchild); 59 lra_show(t->rchild); 60 printf("%c\t",t->item); 61 } 62 int main(void) 63 { 64 char ch[100] = "abdh11i11e11cf11g11"; 65 BiTree *t; 66 CreateBiTree(&t,ch); 67 printf("先序遍历二叉树\n"); 68 alr_show(t); 69 printf("\n"); 70 printf("中序遍历二叉树\n"); 71 lar_show(t); 72 printf("\n"); 73 printf("后序遍历二叉树\n"); 74 lra_show(t); 75 printf("\n"); 76 77 }
View Code
【数据结构】——构建二叉树,遍历二叉树相关推荐
- 数据结构-中序遍历二叉树(基于C++)
二叉树是一种常见的数据结构,它由节点和边组成,每个节点最多有两个子节点,分别称为左子节点和右子节点.二叉树的遍历是指按照一定的顺序访问二叉树中的所有节点,常见的遍历方式有前序遍历.中序遍历和后序遍历. ...
- 数据结构-----后序遍历二叉树非递归算法(利用堆栈实现)
一.非递归后序遍历算法思想 后序遍历的非递归算法中节点的进栈次数是两个,即每个节点都要进栈两次,第二次退栈的时候才访问节点. 第一次进栈时,在遍历左子树的过程中将"根"节点进栈,待 ...
- C++数据结构——中序遍历二叉树
中序遍历二叉树 按完全二叉树的层次遍历给出一棵二叉树的遍历序列(其中用0表示虚结点),要求输出该二叉树的深度及中序遍历该二叉树得到的序列. 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T ...
- html二叉树遍历,二叉树的遍历算法
二叉树的遍历算法 概述 二叉树作为一个基础的数据结构,遍历算法作为一个基础的算法,两者结合当然是经典的组合了.很多题目都会有 ta 的身影,有直接问二叉树的遍历的,有间接问的.比如要你找到树中满足条件 ...
- html二叉树遍历,二叉树的遍历(前序、中序、后序、层次)
基本性质 每个结点最多有两棵子树,左子树和右子树,顺序不可颠倒. 非空二叉树第\(n\)层最多有\(2^{n-1}\)个元素. 深度为\(h\)的二叉树,至多有\(2^h-1\)个结点. 结点结构 c ...
- 数据结构之二叉树,二叉树存储结构,二叉树遍历,霍夫曼树以及图解
数据结构之二叉树 树 什么是树? 树是一种一对多的数据结构.树有很多子集,比如:二叉树.完全二叉树.满二叉树.二叉搜索树等等. 树的特征: 没有父结点的叫做根,一个树有且只有一个根: 每个结点有0个或 ...
- C++实现递归,非递归遍历二叉树(前序,中序,后序)
初学二叉树那会儿,始终掌握不好二叉树的遍历方法,更认为非递归遍历晦涩难懂没有掌握的意义.实际上非递归的遍历方法很有用处,由于每次递归都需要将函数的信息入栈,当递归层数太深很容易就导致栈溢出,所以这个时 ...
- 数据结构-王道-树和二叉树
[top] 树和二叉树 树:是\(N(N\geq0)\)个结点的有限集合,\(N=0\)时,称为空树,这是一种特殊情况.在任意一棵非空树中应满足: 有且仅有一个特定的称为根的结点. 当\(N>1 ...
- 数据结构与算法一 - 二叉树基础
前言 树是数据结构中的重中之重,尤其以各类二叉树为学习的难点.一直以来,对于树的掌握都是模棱两可的状态,现在希望通过写一个关于二叉树的专题系列.在学习与总结的同时更加深入的了解掌握二叉树.本系列文章将 ...
- 数据结构06树和二叉树
第六章 树和二叉树 6.1 树的定义和基本术语 树 Tree 是n个结点的有限集. 任意一棵非空树中: (1)有且仅有一个特定的称为根(root)的结点: (2)当n>1时,其余结点可分为m(m ...
最新文章
- 【Teradata】grouping和rollup窗口函数
- 成功案例_网络营销成功案例分析
- Java中恒等条件判断:“equals”和“==”
- 线程安全的signals
- AOSP 源码整编单编
- MFC改变static text颜色
- ThreadLocal的第二种用法 part2
- C语言中指针的地址和内容
- TYUT-A专题题解(二)
- LeetCode 简单等级
- 基于三维冲击波的变分理论--交通运输工程(一)
- 2021最新15个App跨平台开发框架
- Matlab绘制图像(plot函数)
- 计算机开机后黑屏一闪一闪怎么办,Win7开机后黑屏左上角光标闪烁的解决方法...
- 英魂之刃后台用Java,《英魂之刃》系统操作说明
- linux 在沙盒中运行,Linux容器的细粒度沙盒策略执行方法与流程
- 机器学习(十六)推荐系统
- 720度全景拍摄曝光问题如何解决
- 计算机SCI/EI期刊投稿经验
- 小D课堂-jekins-02
热门文章
- STM32工作笔记0079---UCOSIII时间片轮转调度
- weightedrandomSamplers(2)
- 可以用来做ppt的网页效果
- sqlserver数据库备份
- hibernate数据库连接池
- 随想录(无均衡负载的smp os设计)
- kis显示用户登录服务器失败,金蝶KIS专业版提示用户KISAdmin登陆失败。原因:未与信任SQL Server连接相关联...
- android 字符串加密算法,Android常见加密算法实现
- linux1.0内核下载,LINUX1.0 内核是系统的心脏 - 下载 - 搜珍网
- hantzsch酯_有机人名反应——Hantzsch吡啶合成