树和图是数据结构中比较麻烦的东西,里面涉及的概念比较多,也最有用, 就比如一般树广泛应用于人工智能的博弈上,而基于图的广度优先和深度优先搜索也广泛应用于人工智能寻路上面

首先我们要把树进行分类:

>一般树:任意节点子节点个数不限

>二叉树:任意节点子节点个数大于等于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语言二叉树的实现的更多相关文章

  1. 深入浅出数据结构C语言版(12)——从二分查找到二叉树

    在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不 ...

  2. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  3. javascript数据结构与算法-- 二叉树

    javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...

  4. SDUT 3346 数据结构实验之二叉树七:叶子问题

    数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按 ...

  5. SDUT 3345 数据结构实验之二叉树六:哈夫曼编码

    数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 字符的编 ...

  6. SDUT 3340 数据结构实验之二叉树一:树的同构

    数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树 ...

  7. SDUT 3344 数据结构实验之二叉树五:层序遍历

    数据结构实验之二叉树五:层序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按 ...

  8. 【数据结构】之二叉树的java实现

    转自:http://blog.csdn.net/wuwenxiang91322/article/details/12231657 二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的 ...

  9. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

随机推荐

  1. SSE图像算法优化系列十二:多尺度的图像细节提升。

    无意中浏览一篇文章,中间提到了基于多尺度的图像的细节提升算法,尝试了一下,还是有一定的效果的,结合最近一直研究的SSE优化,把算法的步骤和优化过程分享给大家. 论文的全名是DARK IMAGE ENH ...

  2. Java注解Annotation详解

    从JDK5开始,Java增加了Annotation(注解),Annotation是代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取,并执行相应的处理.通过使用Annotation,开发人员可 ...

  3. springboot(十六):使用Jenkins部署Spring Boot

    jenkins是devops神器,本篇文章介绍如何安装和使用jenkins部署Spring Boot项目 jenkins搭建 部署分为三个步骤: 第一步,jenkins安装 第二步,插件安装和配置 第 ...

  4. tomcat集群日志切割和远程备份脚本分享

    笔者一共有3台tomcat服务器,一共4个tomcat服务,未来还会增加4个作为负载,笔者想通过在存储服务器对tomcat服务的日志进行远程切割和备份到存储上. 文中采用清空日志的方式,优点是不用重启 ...

  5. Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  6. 关于mysql插入数据异常

    今天创建数据库时,在插入数据时出现了几个问题.(首次在LInux环境下创建数据库) 一个是关于SQL Error [1146] [42S02]: Table 'struts2exec.s_user' ...

  7. 你绝不能错过的效率神器 —— Alfred

    文章首发于[博客园-陈树义],点击跳转到原文<你绝不能错过的效率神器 -- Alfred> Alfred 是 Mac 系统上一款专注于效率提升的著名应用,它能帮你快速打开网页.快速进行自定 ...

  8. 异常处理-try catch

    一:try catch是什么 try catch是java程序设计中处理异常的重要组成部分 异常是程序中的一些错误,有些异常需要做处理,有些则不需要捕获处理,异常是针对方法来说的,抛出.声明抛出.捕获 ...

  9. JavaSE&&JavaEE&&JavaME的区别【Java中常用的包结构】

    一.javaEEJavaSEJavaME用的同一个jar包吗? javaEE JavaSE javaME 用的JDK是同一个,开发j2SE工程的话只要有JDK就可以了,开发J2EE工程和J2ME工程除 ...

  10. Python Django CMDB项目实战之-3创建form表单,并在前端页面上展示

    基于之前的项目代码 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页.index页.文章页面 Python Django CMDB项目实战之-2创建APP. ...