那么在上一次的分享中,针对链表和顺序表进行了比较,也对于他们二者进行了基础性的分析和说明,那么在模块二中,紧接着上一次的分享,说明一下栈,队列和树的相关知识。
栈
栈的关键主要是记住:先进后出 (可以形象的比喻为洗盘子,先洗的盘子放在最下面,放的时候一个一个放,最先洗完的最后放进碗橱)
并且我们需要明确,栈只是一个逻辑上的概念,并非是实际存在的,并且,出栈的顺序是灵活的,并不是固定的一定是按照进来的顺序走,有可能是进一个出一个,也有可能是全部进来再出,所以,我们要明确不能死记栈的概念,而是要灵活的运用。
队列
队列的关键是:先进先出 (可以形象的比喻成在银行排队取钱,先进去的人排在队伍的前面,完成取钱任务后,先出门)
队列和栈两者有一个很明显的区别,就是出的顺序,所以在记忆的时候,我们可以组合在一起记忆,并且将他们各自都形象的记忆,这样有利于我们区分两者之间的关系,也有利于我们记忆。
那么,队列中还包括循环队列 :在判断循环队列空的条件:head=tail 这个式子也可以表示队满的情况, 但也有这种可能,就是他的尾指针并没有和他的头指针存在一个地址里,为了区分开来,头地址和尾地址之间还存在一个地址,即其队满的条件是:tail+1=head
树
首先,我们在说明树的一些问题的时候,我们需要明确有关于树的相关基本概念:
1、节点的度 (就看与下一层与几个结点相关联)
2、树的度 (所有节点中度最高的)
3、叶子节点 (度为0的结点)
4、分支结点 (除叶子结点以外其余的结点)
5、内部结点 (分支结点除根节点外的结点)
6、父节点
7、子结点 (父节点,子节点,兄弟结点都是相对的量和概念,都是一个结点相对另一个结点而言的)
8、兄弟节点
树的遍历
前序遍历: 先访问根节点,再访问叶子结点
后序遍历:先访问子结点,再访问根节点
层次遍历:一层一层的访问
那么,我们需要明白,每一次访问子结点的时候,都必须从左开始,先访问左子结点,再去访问右子结点
二叉树
在说有关二叉树的相关内容的时候,我们必须要区分开一个问题。就是二叉树他并不是一个特殊的树,而是一个独立的数据结构,并且,二叉树最多只能有两个子结点结点,左子结点和右子结点。
二叉树可分为:满二叉树,完全二叉树和非完全二叉树
明确二叉树的相关概念后我们来看一下二叉树的重要的特性:
1、在二叉树的第i层上最多有2的i-1次个结点 (i>=1);
2、深度为k的二叉树最多有2的k-1次个结点 (k>=1);
3、对任何一颗二叉树,如果其叶子结点树为n0,度为2的结点数为n2,则n0=n2+1;
注: 若一个完全二叉树有n层,则其n-1层就是满二叉树,最后一层排列也必须是从左至右排列 。 这个同时也是构成完全二叉树的条件。
4、如果对于一颗有n个结点的完全二叉树的结点按层编号(从第一层到 log2n向下取整+1 层 ,每层都是从左到右),则对于任意结点i(1<=i<=n),有:
① 如果 2i>n,则结点i为叶子结点,无左子结点,否则右子结点是结点2i。
②如果2i+1>n,则结点i无右子结点,左子结点是2i+1;
二叉树的遍历
二叉树的遍历与树的遍历相同,但是多了一个中序遍历。其余三种遍历的条件和方向都一样,
中序遍历:先访问左子结点,再访问根节点,最后访问右子结点。
既然说了树和二叉树各自的内容,那么我们来看一下,树和二叉树之间是怎么转换的
树和二叉树之间的转换需要符合以下的规则:一棵树若要转换成等价的二叉树,对于任何一个结点,树的孩子结点作为它转换成二叉树中的左子树结点,树的兄弟结点全部变成新转换之后的右子树结点。
那么我们需要注意的是,在数转换成二叉树之后,他同样需要有遍历的操作,那么,在树正确转换之后,
1、两者的前序遍历相同
2、树的后序遍历是二叉树的中序遍历
查找二叉树
查找二叉树又叫做二叉排序树,即一个查找二叉树要么是一颗空树,要么是满足以下递归条件:
①:查找树的左,右树各是一颗查找树
②:若查找二叉树的左子树排空,则其左子树的各结点值均小于根结点的值
③:若查找树的右子树排空,则其右子树的各结点值均大于根节点值。
以上均为今天的分享,因为时间和分值的分布,只能系统的阐述一下各关系和内涵,所以,如果要有一个深层次的认识和了解的话,还是需要下面自己在多加找相关的练习题进行操作联系,加强自己的熟练程度的记忆。