二叉树的数据结构:

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

【数据结构】——构建二叉树,遍历二叉树相关推荐

  1. 数据结构-中序遍历二叉树(基于C++)

    二叉树是一种常见的数据结构,它由节点和边组成,每个节点最多有两个子节点,分别称为左子节点和右子节点.二叉树的遍历是指按照一定的顺序访问二叉树中的所有节点,常见的遍历方式有前序遍历.中序遍历和后序遍历. ...

  2. 数据结构-----后序遍历二叉树非递归算法(利用堆栈实现)

    一.非递归后序遍历算法思想 后序遍历的非递归算法中节点的进栈次数是两个,即每个节点都要进栈两次,第二次退栈的时候才访问节点. 第一次进栈时,在遍历左子树的过程中将"根"节点进栈,待 ...

  3. C++数据结构——中序遍历二叉树

    中序遍历二叉树 按完全二叉树的层次遍历给出一棵二叉树的遍历序列(其中用0表示虚结点),要求输出该二叉树的深度及中序遍历该二叉树得到的序列. 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T ...

  4. html二叉树遍历,二叉树的遍历算法

    二叉树的遍历算法 概述 二叉树作为一个基础的数据结构,遍历算法作为一个基础的算法,两者结合当然是经典的组合了.很多题目都会有 ta 的身影,有直接问二叉树的遍历的,有间接问的.比如要你找到树中满足条件 ...

  5. html二叉树遍历,二叉树的遍历(前序、中序、后序、层次)

    基本性质 每个结点最多有两棵子树,左子树和右子树,顺序不可颠倒. 非空二叉树第\(n\)层最多有\(2^{n-1}\)个元素. 深度为\(h\)的二叉树,至多有\(2^h-1\)个结点. 结点结构 c ...

  6. 数据结构之二叉树,二叉树存储结构,二叉树遍历,霍夫曼树以及图解

    数据结构之二叉树 树 什么是树? 树是一种一对多的数据结构.树有很多子集,比如:二叉树.完全二叉树.满二叉树.二叉搜索树等等. 树的特征: 没有父结点的叫做根,一个树有且只有一个根: 每个结点有0个或 ...

  7. C++实现递归,非递归遍历二叉树(前序,中序,后序)

    初学二叉树那会儿,始终掌握不好二叉树的遍历方法,更认为非递归遍历晦涩难懂没有掌握的意义.实际上非递归的遍历方法很有用处,由于每次递归都需要将函数的信息入栈,当递归层数太深很容易就导致栈溢出,所以这个时 ...

  8. 数据结构-王道-树和二叉树

    [top] 树和二叉树 树:是\(N(N\geq0)\)个结点的有限集合,\(N=0\)时,称为空树,这是一种特殊情况.在任意一棵非空树中应满足: 有且仅有一个特定的称为根的结点. 当\(N>1 ...

  9. 数据结构与算法一 - 二叉树基础

    前言 树是数据结构中的重中之重,尤其以各类二叉树为学习的难点.一直以来,对于树的掌握都是模棱两可的状态,现在希望通过写一个关于二叉树的专题系列.在学习与总结的同时更加深入的了解掌握二叉树.本系列文章将 ...

  10. 数据结构06树和二叉树

    第六章 树和二叉树 6.1 树的定义和基本术语 树 Tree 是n个结点的有限集. 任意一棵非空树中: (1)有且仅有一个特定的称为根(root)的结点: (2)当n>1时,其余结点可分为m(m ...

最新文章

  1. 【Teradata】grouping和rollup窗口函数
  2. 成功案例_网络营销成功案例分析
  3. Java中恒等条件判断:“equals”和“==”
  4. 线程安全的signals
  5. AOSP 源码整编单编
  6. MFC改变static text颜色
  7. ThreadLocal的第二种用法 part2
  8. C语言中指针的地址和内容
  9. TYUT-A专题题解(二)
  10. LeetCode 简单等级
  11. 基于三维冲击波的变分理论--交通运输工程(一)
  12. 2021最新15个App跨平台开发框架
  13. Matlab绘制图像(plot函数)
  14. 计算机开机后黑屏一闪一闪怎么办,Win7开机后黑屏左上角光标闪烁的解决方法...
  15. 英魂之刃后台用Java,《英魂之刃》系统操作说明
  16. linux 在沙盒中运行,Linux容器的细粒度沙盒策略执行方法与流程
  17. 机器学习(十六)推荐系统
  18. 720度全景拍摄曝光问题如何解决
  19. 计算机SCI/EI期刊投稿经验
  20. 小D课堂-jekins-02

热门文章

  1. STM32工作笔记0079---UCOSIII时间片轮转调度
  2. weightedrandomSamplers(2)
  3. 可以用来做ppt的网页效果
  4. sqlserver数据库备份
  5. hibernate数据库连接池
  6. 随想录(无均衡负载的smp os设计)
  7. kis显示用户登录服务器失败,金蝶KIS专业版提示用户KISAdmin登陆失败。原因:未与信任SQL Server连接相关联...
  8. android 字符串加密算法,Android常见加密算法实现
  9. linux1.0内核下载,LINUX1.0 内核是系统的心脏 - 下载 - 搜珍网
  10. hantzsch酯_有机人名反应——Hantzsch吡啶合成