您的位置:首页 > 理论基础 > 数据结构算法

数据结构全攻略--攻破非线性结构堡垒之树和二叉树(一)

2013-10-04 09:11 330 查看
前两篇博客集中讨论了线性结构,线性结构是基础,同时也是数据结构的至关重要的一部分。学好了线性结构,那非线性结构的很多知识点也都很容易了,因为非线性结构中的很多概念在线性结构中都有体现。学习也是如此,很多知识并不是凭空产生的,而是为了解决实际的问题才有了理论,我们应该把以前学过的知识和现在已有的相联系,或者和日常生活中的事物相联系,这样能够加强我们对新知识的理解程度,另外还能帮助我们记忆。

树和二叉树



一、树和二叉树区分开了吗

二叉树是一种特殊的树?答案是正确的,也就是说树的一些性质同样适用于二叉树。虽然答案是正确的,但是我们在理解概念时还是不要把二叉树列入树中的好,因为二叉树和树的结构有着本质的区别。其中最主要的区别是:二叉树中节点的子树需要区分左子树和右子树,即使在结点只有一棵子树的情况下,也要明确指出该子树是左子树还是右子树。另外,二叉树的结点最大度为2,而树中不限制结点的度。




刚接触树结构的时候是不是认为二叉树是树的一种,其实树形结构是一种思想,可以形象的看成分层,很多地方都用到了这种思想。

那看看树和二叉树部分都有哪些知识点吧




上图是非线性结构的第一部分树和二叉树,还有一部分的是有关图的将会在这部分结束后讨论。

二、先看看树形结构

树结构是非常重要的非线性结构,它是由有限个结点组成一个具有层次关系的集合。它的形状看起来很像一棵倒挂的树,也就是说它是根朝上,而叶朝下的结构,所以称为“树”。



看了上图就应该知道树形结构的基本概念了吧,它很向现实生活中的树,有枝、叶。上面的图(a)是站在结点的角度介绍的一些有关结点的概念,包括根结点、双亲、孩子和兄弟、叶子结点、内部结点;图(b)是站在树的角度介绍了树的一些基本概念,包括树的度,树的层次。

1 从上图中能发现树的一些性质吗?

总结点数n=总度数(所有结点的度数之和)k+1,这个性质其实很简单,它是每个结点的度的总和数,最后还要加上一个根结点。

2 它都有哪几种存储结构呢?

树的存储结构有两种,这两中存储方式很简单,只要好好学习了线性结构中链表那部分的知识,这儿是很容易的。树是由结点和边构成,而且在结点中存放了指针的信息,所以按照指针信息的不同,树的存储结构又分为了标准存储结构和带逆存储结构。

标准存储结构,这种存储方式类似于单链表,树的每个结点可分为两部分,分别是结点的数据和指向子结点的指针数组。它的存储结构数据类型为:

#define N 5
typedef struct tnode{
	char data;   /*树结点的数据信息*/
	struct tnode *child
;  /*树结点的子结点指针*/
}TNODE;/*树结点的数据类型*/


带逆存储结构,这种存储结构难道类似于线性结构的双链表?bingo,它在标准存储结构基础上又增加了指针,增加的指针用来指向了父结点。数据类型的结构如下:
#define N 5
typedef struct rtnode{
	char data;/*树的结点数据信息*/
	struct rtnode *child
;/*树结点的子结点指针*/
	struct rtnode *parent;/*父结点指针*/
}RTNODE;/*树结点的数据类型*/




那它是不是和线性结构一样能够逐个访问树中的结点?

学了线性结构,那我们的非线性结构就很简单了。如果想要逐个获得树中全部结点的信息,就需要使用到树的遍历了。遍历是一种特别重要的概念,它的意思是逐个的读取某个结构中的数据。其中树的遍历分为前序、后序、层次三种。

还是拿我们的ABCDEFG说事,看看下图的几种遍历:



树的前序遍历是一种先根遍历,每次遍历子树时都是先从根结点开始,然后依次从左到右遍历子节点;后序遍历和前序遍历恰好相返,从子节点下手,从左到右最后延伸至根结点;树的层次遍历又称深度遍历,在遍历时按照层级关系,一层层向下递进。

看完了树,是不是感觉很简单,只要学好了线性结构,掌握树结构是很容易的事。学完了树,非线性结构还远没有结束,接下来看看二叉树。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐