一、定义

二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做森林。

二、基本概念

二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:
(1)空二叉树——如图(a);

(2)只有一个根结点的二叉树——如图(b);

(3)只有左子树——如图(c);
(4)只有右子树——如图(d);
(5)完全二叉树——如图(e)。
注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。[1] 

三、类型

(1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树
(2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
(3)平衡二叉树——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。[2] 

四、相关术语

树的结点:包含一个数据元素及若干指向子树的分支;
孩子结点:结点的子树的根称为该结点的孩子;
双亲结点:B 结点是A 结点的孩子,则A结点是B 结点的双亲;
兄弟结点:同一双亲的孩子结点; 堂兄结点:同一层上结点;
祖先结点: 从根到该结点的所经分支上的所有结点子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙
结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推;
树的深度:树中最大的结点层
结点的度:结点子树的个数
树的度: 树中最大的结点度。
叶子结点:也叫终端结点,是度为 0 的结点;
分枝结点:度不为0的结点;
有序树:子树有序的树,如:家族树;
无序树:不考虑子树的顺序;[3]
五、代码实现
  1. // main.c
  2.  
  3. // C语言-二叉树
  4.  
  5. //
  6.  
  7. // Created by rimi on 2017/5/24.
  8.  
  9. // Copyright © 2017年 rimi. All rights reserved.
  10.  
  11. #include <stdio.h>
  12.  
  13. #include <stdlib.h>
  14. struct TreeNode {
  15.  
  16. char data;
  17.  
  18. struct TreeNode * left;
  19.  
  20. struct TreeNode * right;
  21.  
  22. };
  23. // 创建树
  24.  
  25. struct TreeNode * createTree();
  26.  
  27. // 先序遍历
  28.  
  29. void preTraverse(struct TreeNode * root);
  30.  
  31. // 中序遍历
  32.  
  33. void centerTraverse(struct TreeNode * root);
  34.  
  35. // 后序遍历
  36.  
  37. void backTraverse(struct TreeNode * root);
  38. int main(int argc, const char * argv[]) {
  39.  
  40. // preTraverse(createTree());
  41.  
  42. centerTraverse(createTree());
  43.  
  44. // backTraverse(createTree());
  45.  
  46. return ;
  47.  
  48. }
  49.  
  50. // 创建树
  51.  
  52. struct TreeNode * createTree(){
  53. struct TreeNode * pa = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  54.  
  55. struct TreeNode * pb = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  56.  
  57. struct TreeNode * pc = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  58.  
  59. struct TreeNode * pd = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  60.  
  61. struct TreeNode * pe = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  62.  
  63. struct TreeNode * pf = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  64.  
  65. struct TreeNode * pg = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  66.  
  67. pa->data = 'A';
  68.  
  69. pb->data = 'B';
  70.  
  71. pc->data = 'C';
  72.  
  73. pd->data = 'D';
  74.  
  75. pe->data = 'E';
  76.  
  77. pf->data = 'F';
  78.  
  79. pg->data = 'G';
  80.  
  81. pa->left = pb;
  82. pa->right = pc;
  83.  
  84. pb->left = pd;
  85. pb->right = NULL;
  86.  
  87. pc->left = pe;
  88. pc->right = pf;
  89.  
  90. pd->left = NULL;
  91.  
  92. pd->right = pg;
  93.  
  94. pe->left = NULL;
  95.  
  96. pe->right = NULL;
  97.  
  98. pf->left = NULL;
  99.  
  100. pf->right = NULL;
  101.  
  102. pg->left = NULL;
  103.  
  104. pg->right = NULL;
  105. return pa;
  106.  
  107. }
  108.  
  109. // 先序遍历
  110.  
  111. void preTraverse(struct TreeNode * root){
  112.  
  113. if (root != NULL) {
  114.  
  115. printf("%c\n", root->data);
  116.  
  117. preTraverse(root->left);
  118.  
  119. preTraverse(root->right);
  120.  
  121. }
  122.  
  123. }
  124.  
  125. // 中序遍历
  126.  
  127. void centerTraverse(struct TreeNode * root){
  128.  
  129. if(root !=NULL) {
  130.  
  131. centerTraverse(root ->left);
  132. printf("%c \n",root ->data);
  133.  
  134. centerTraverse(root->right);
  135.  
  136. }
  137.  
  138. }
  139. // 后序遍历
  140.  
  141. void backTraverse(struct TreeNode * root){
  142.  
  143. if(root !=NULL){
  144.  
  145. backTraverse(root ->left);
  146.  
  147. backTraverse(root ->right);
  148.  
  149. printf("%c \n",root ->data);
  150.  
  151. }
  152. }

C语言数据库-二叉树的更多相关文章

  1. C语言数据库编程

    ----摘自个人C语言数据库项目报告 3.4逻辑结构的SQL语句实现 创建基本表: 3.4-1建立商品表: create table goods(goods_id int primary key,go ...

  2. C语言实现二叉树-02版

    ---恢复内容开始--- 昨天,提交完我们的二叉树项目后,今天早上项目经理早早给我打电话: 他说,小伙子干的不错.但是为什么你上面的insert是recusive的呢? 你难道不知道万一数据量大啦!那 ...

  3. C语言实现二叉树-利用二叉树统计单词数目

    昨天刚参加了腾讯2015年在线模拟考: 四道大题的第一题就是单词统计程序的设计思想: 为了记住这一天,我打算今天通过代码实现一下: 我将用到的核心数据结构是二叉树: (要是想了解简单二叉树的实现,可以 ...

  4. Atitit.跨语言数据库db  api兼容性 jdbc odbc ado oledb 增强方案

    Atitit.跨语言数据库db  api兼容性 jdbc odbc ado oledb 增强方案 1. 跨语言db api兼容性..1 2. 目前访问数据库的接口很多.比较常用的jdbc odbc 以 ...

  5. C语言实现二叉树

    二叉树的重要性就不用多说啦: 我以前也学习过,但是一直没有总结: 网上找到的例子,要么是理论一大堆,然后是伪代码实现: 要么是复杂的代码,没有什么解释: 最终,还是靠FQ找到一些好的文章,参考地址我会 ...

  6. C语言实现二叉树的基本操作

    二叉树是一种非常重要的数据结构.本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历.中序遍历.后序遍历.层次遍历),二叉搜索树的构造等. 1. 二叉树的构建 二叉树的基本 ...

  7. R语言︱ 数据库SQL-R连接与SQL语句执行(RODBC、sqldf包)

    要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 数据库是极其重要的R语言数据导入源 ...

  8. C语言描述二叉树的实现及操作(链表实现)

    概述     二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...

  9. 使用go语言数据库

    1.下载并导入数据库驱动包(注意配置环境变量.数据库.go.以及ENV) 这里选择了Go-MySQL-Driver这个实现.地址是:https://github.com/go-sql-driver/m ...

随机推荐

  1. Python为什么会打印两个\

    在Python里面,如果\后面不是一个合法的转移字符,那么,Python会打印两个\,换句话说,Python将\也当成普通字符看待,而不是转义符的标志: >>>S = 'C:\py\ ...

  2. Android 开发 之 JNI入门 - NDK从入门到精通

    NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...

  3. js中斜杠转义

    js中“/”不需要转义. if(myPath.indexOf("/Upload/EmailFile/")!=-1){ alert("有附件!")}

  4. android入门 — ListView

    ListView主要是用来解决大量数据展示的问题,它的用途很广泛,几乎所有的app都会用到,比如说知乎.今日头条.微博.通讯录等. ListView允许用户通过上下滑动的方式将屏幕外的数据滚动到屏幕中 ...

  5. C#常见函数

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. C#中Console.ReadLine()和Console.Read()有何区别?

    Console.Read 表示从控制台读取字符串,不换行. Console.ReadLine 表示从控制台读取字符串后进行换行. Console.Read() Console.ReadLine()方法 ...

  7. BIO、NIO、AIO通信机制

    一.BIO的理解 首先我们通过通信模型图来熟悉下BIO的服务端通信模型:采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端的连接请求之后为每个客户端创 ...

  8. vs2015常用代码块与自定义代码块

    常用代码块 代码段名 描    述 #if 该代码段用#if和#endif命令围绕代码 #region 该代码段用#region和#endregion命令围绕代码 ~ 该代码段插入一个析构函数 att ...

  9. 第49天:封装自己的scrollTop

    一.scroll家族 offset 自己的偏移scroll滚动的 scrollTop和scrollLeftscrollTop 被卷去的头部当滑动滚轮浏览网页的时候,网页隐藏在屏幕上方的距离二.页面滚动 ...

  10. Python面向对象—类的继承

    一个子类可以继承父类的所有属性,不管是父类的数据属性还是方法. class Father(object): num = 0 def __init__(self): print "I'm Pa ...