数据结构与算法(二叉树)
1>前面我们已经讲了线性结构,栈,队列,链表等线性结构,今天我们来讲一下一种非常重要的非线性结构:树
解释:你有没有发现非线性结构"树"和我们现实生活中的"树"很相似,这里面每一个点都是树的节点,节点与节点存在这某种关系,比如节点与节点相连接的关系叫做父子节点
解释:B,C,D的父节点是A,B,C,D被叫做兄弟节点,B,C,D是A的子节点,没有父子节点的节点叫做根节点,如图E,我们把没有子节点的节点叫做叶子节点,比如GHIJKL节点除此之外数据还有深度,高度,层的概念
高度:节点到叶子节点的最长路径(边数)
深度:根节点到这个节点所经历额边的个数
层数:节点的深度+1
树的高度:根节点的高度
这3个概念容易比较混淆,我们必须明确,讨论高度,必须从下到上谈起,且从0为基准开始,讨论深度,必须从上到下谈起,也是以0作为基准.举个列子,一看就明白了
2>二叉树
二叉树,顾名思义,每个节点做多有2个叉,一个左节点,一个右节点.,有的二叉树只有左节点,有的二叉树只有右节点,
上图是典型的二叉树,不过上图有2个特殊二叉树,2号图为满二叉树,3号图为完全二叉树
满二叉树:除了叶子节点,没个节点都有左节点和右节点,这样的二叉树是满二叉树
完全二叉树:叶子节点都在最第底下的2层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他节点的个数要达到最大,
3>二叉树的存储方式
我们先看一下数的链式存储方式,
解释: 我们可以很清楚的看到,每个节点都分为3部分,一部分存储数据,另外2部分分别是指向左右节点的指针,我们主要抓住根节点就可以把整个二叉树挂起来.
基于数组的存储方式
我们把根节点的下标设置为1那么A的左节点的下标为2*i,则右节点的下标为2*i+1,以此类推,B的右子节点的下标为 2*i=4,右节点的下标为2*i+1,我们只要知道根节点的下标,就可以计算出每个节点的下标位置,i/2是它的父节点 2i+1是右节点 2i是左节点.
根据数组的存储方式,对于完全二叉树来树,根节点的下标是从1开始的,所以他会浪费数组的一个存储空间,即第0个位置
我们举一个非完全二叉树的列子,我们来看看他在数组中的存储方式
总结,无疑的是,如果是以个完全的二叉树,使用数组的方式是最节省空间的,用数组来实现完全二茶叉树的存储,只是需要浪费一个存储空间,但是基于链表方式,我们需要更到的内存空间开存储每个节点的指向左右节点的指针,这也是为什么完全二叉树的最后一层的子节点都靠左的原因,为了防止浪费更多的内存空间.
3>二叉树的遍历
二叉树的遍历右3种方式,分别是前序遍历(根左右),中序遍历(左根右),后续遍历(左右根),遍历的具体操作请进行百度..