[数据结构]C语言二叉树的实现
树和图是数据结构中比较麻烦的东西,里面涉及的概念比较多,也最有用, 就比如一般树广泛应用于人工智能的博弈上,而基于图的广度优先和深度优先搜索也广泛应用于人工智能寻路上面
首先我们要把树进行分类:
>一般树:任意节点子节点个数不限
>二叉树:任意节点子节点个数大于等于0,小于等于2,也即是说0<=n<=2
>森林:N个不相交的树的集合
在讲下面之前你有必要搞懂一些概念,这里我引入一张图片并试图说明这些概念:
根:我们习惯吧最上面的A节点表示为root(根),这个概念可以与生活联系,只不过这里的根是在最上面,
深度:也就是树的层数,比如上图有4层,所以深度为4
节点,就是每一个矩形,树是由节点组成的,因此根也叫做根节点
子节点/孩纸:就是一个节点的下面离它最近的的节点,比如A的子节点是BC而不是BCDEFG,E的子节点是G,G没有子节点
父节点/父亲:这里就是倒置了一下,比如G的父节点是E,EF的父节点是C,BC的父节点是A
堂兄弟:D的堂兄弟是EF
根据上面的概念和上面对树的定义你应该知道这是一个二叉树。
由于二叉树的广泛应用与研究,所以这里我们讨论二叉树,其实森林和一般树都可以转化为一个一般树,转换原则就是把一个节点的第一个子节点变成二叉树的左节点,然后其他堂兄弟就是右节点,这句话不指望你能看懂,因为我都感觉没有表述清楚,我认为这个视频讲得比较好http://pan.baidu.com/s/1i3yYd2t
然后我们再细分二叉树,它分为:
空二叉树:就是什么都没有
满二叉树:每个节点都有两个子节点
完全二叉树:把一颗完全二叉树的最后一层从右往左删除一些节点得到的就是完全二叉树
二叉树也分顺序存储和链式存储,因为顺序存储比较浪费内存,所以这里考虑用链式存储实现
struct node{
char data;
struct node *lchild;
struct node *rchild;
};
这样我们就定义了一个简单的二叉树节点,它包含一个数据域和两个指针域,两个指针域分别用来指向左孩纸(左节点)和右孩纸(右节点),然后再看看这图,我们接下来将定义一个如图所示的二叉树:
struct node *create_binary_tree(){
struct node *root;
struct node *a=new node,*b=new node,*c=new node,*d=new node,*e=new node,*f=new node,*g=new node;
a->data='A';
b->data='B';
c->data='C';
d->data='D';
e->data='E';
f->data='F';
g->data='G';
a->lchild=b;
a->rchild=c;
b->lchild=d;
b->rchild=NULL;
c->lchild=e;
c->rchild=f;
d->lchild=NULL;
d->rchild=NULL;
e->lchild=g;
e->rchild=NULL;
f->lchild=NULL;
f->rchild=NULL;
g->lchild=NULL;
g->rchild=NULL;
root=a;
return root;
}
上面代码非常简单,结合上图可以很容易理解
接下来讲的就是重点了:二叉树的遍历
二叉树的遍历分为前序遍历,中序遍历,后序遍历,层序遍历
你得用心才能看懂下面的内容,还是再次建议看一下这个视频http://pan.baidu.com/s/1i3yYd2t
首先讲讲最简单的层序遍历,顾名思义,从上至下一层一层的遍历,所以遍历顺序就是ABCDEFG
然后是前序遍历,前序遍历的原则就是先遍历根节点(注意这里的根节点是相对意义上的),然后再遍历左节点,然后遍历右节点,所以遍历顺序是ABDCEGF
接下来就是中序遍历,中序遍历就是先遍历左节点,然后遍历根,最后右节点,所以遍历顺序就是DBAGECF
最后是后序遍历,后序遍历是先遍历左节点然后右节点最后根,所以遍历顺序是DBGEFCA
这里看似很麻烦,但是如果我们用代码写其实很简单,主要运用了递归的思想,代码如下:
//ABDCEGF前序
void PreTraversal(struct node *root){
if(root!=NULL){
std::cout<<root->data;
PreTraversal(root->lchild);
PreTraversal(root->rchild);
}
}
//DBAGECF中序
void InTraversal(struct node *root){
if(root!=NULL){
InTraversal(root->lchild);
std::cout<<root->data;
InTraversal(root->rchild);
}
}
void insert(struct node *root){
}
//DBGEFCA后序
void NexTraversal(struct node *root){
if(root!=NULL){
NexTraversal(root->lchild);
NexTraversal(root->rchild);
std::cout<<root->data;
}
}
到这里就结束了,我们没有讲动态二叉树的创建,这里提供一份资料以供参考[1]
[数据结构]C语言二叉树的实现的更多相关文章
- 深入浅出数据结构C语言版(12)——从二分查找到二叉树
在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不 ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- javascript数据结构与算法-- 二叉树
javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...
- SDUT 3346 数据结构实验之二叉树七:叶子问题
数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按 ...
- SDUT 3345 数据结构实验之二叉树六:哈夫曼编码
数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 字符的编 ...
- SDUT 3340 数据结构实验之二叉树一:树的同构
数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树 ...
- SDUT 3344 数据结构实验之二叉树五:层序遍历
数据结构实验之二叉树五:层序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按 ...
- 【数据结构】之二叉树的java实现
转自:http://blog.csdn.net/wuwenxiang91322/article/details/12231657 二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的 ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
随机推荐
- C#图片压缩上传
/// <summary> /// 压缩图片 /// </summary> /// <param name="iSource">图片文件< ...
- 2712:细菌繁殖-poj
2712:细菌繁殖 总时间限制: 1000ms 内存限制: 65536kB 描述 一种细菌的繁殖速度是每天成倍增长.例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,… ...
- OC中只有重写没有重载
一.类的继承 Objective-c中类的继承与C++类似,不同的是Objective-c不支持多重继承,一个类只能有一个父类,单继承使Objective-c的继承关系很简单,易于管理程序. 二.方法 ...
- 16. 使用Exhibitor管理ZooKeeper
Exhibitor是管理ZooKeeper服务实例的主管服务.由Netflix开发和开放源码,对于ZooKeeper的实例监控.备份/恢复.清理和可视化非常有用. Note Netflix Exhib ...
- ubuntu指令记录
记录一些指令,便于查看使用. 1.sudo -以其他身份运行命令,预设身份为root. 2.ctrl+alt+T打开终端(命令行窗口) 3.如何判断linux系统是32位还是64位,指令:getcon ...
- 51Nod 1293 球与切换器 DP分类
基准时间限制:1 秒 空间限制:131072 KB 有N行M列的正方形盒子.每个盒子有三种状态0, -1, +1.球从盒子上边或左边进入盒子,从下边或右边离开盒子.规则: 如果盒子的模式是-1,则 ...
- 51Nod1136--欧拉函数
1136 欧拉函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命 ...
- CentOS6 图形界面(gnome)安装,使用vnc进行远程连接
CentOS6相对于CentOS5的安装有了不少的进步,有不少默认的选项可以选择,如: Desktop :基本的桌面系统,包括常用的桌面软件,如文档查看工具. Minimal Desktop :基本的 ...
- BFS求最短路 Abbottt's Revenge UVa 816
本题的题意是输入起点,朝向和终点,求一条最短路径(多解时任意输出一个即可) 本题的主要代码是bfs求解,就是以下代码中的slove的主要部分,通过起点按照路径的长度来寻找最短路径,输出最先到终点的一系 ...
- vue.js之生命周期,防止闪烁,计算属性的使用,vue实例简单方法和循环重复数据
摘要:今天是比较糟糕的一天没怎么学习,原因是学校的wifi连不上了~~.今天学习一下vue的生命周期,如何防止闪烁(也就是用户看得到花括号),计算属性的使用,vue实例简单方法,以及当有重复数据时如何 ...