最近在看C++的习题,几乎每套选择题都会出现二叉树,因为之前对数还是比较熟悉的,所以上一篇总结了从零开始学习树,很自然的就想到比较二者到底有什么区别,那么首先来看看二叉树到底有哪些性质,在来说二者有什么区别。
一、基本性质:
1) 在二叉树中,第i层的结点总数不超过2^(i-1);2) 深度为h的二叉树最多有2^h-1个结点(h>=1),最少有h个结点;
3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
4) 具有n个结点的完全二叉树的深度为int(log2n)+1
5)给定N个节点,能构成h(N)种不同的二叉树。h(N)为卡特兰数的第N项。h(n)=C(n,2*n)/(n+1)。
二、什么是完全二叉树?
若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层有叶子结点,并且叶子结点都是从左到右依次排布。三、什么是满二叉树?
除了叶结点外每一个结点都有左右子结点且叶子结点都处在最底层的二叉树。四、存储方式
存储的方式和图一样,有链表和数组两种,用数组存访问速度快,但插入、删除节点操作就比较费时了。实际中更多的是用链来表示二叉树的。五、遍历方法
分为前序遍历,中序遍历和后序遍历,和按层次遍历。前三种方法可用递归实现,比较简单,不用递归的可以自己模拟栈操作来实现非递归的遍历方法。按层遍历也比较简单,就是自己实现一个队列就可以了,也可以用数组来模拟。需要注意的是后序遍历的非递归算法,需要一个标识来标识某个节点的状态,具体的就是当一个节点左孩子被遍历的时候为一个状态,当左右两个节点都被遍历的时候又是一个状态,只有一个节点的左右孩子几点都被遍历,才可以输出这个节点的值,这个和后序遍历的定义差不多。下面用一个例子介绍
接下来看是如何遍历的。
前序遍历
遍历的结果是:1、2、4、5、7、8、3、6。从根结点分两部分,先把左边的遍历完,都是从左到右的。
中序遍历
结果是:4,2,7,8,5,1,3,6。
后序遍历
结果是:4、8、7、5、2、6、3、1
层次遍历
结果是:1、2、3、4、5、6、7、8
六、树转换成二叉树
这个其实也不难分三步:连线、抹线、旋转三步就可以了。1)连线:每一层兄弟结点连在一起。
2)抹线:对每个结点,除了其最左端的子女结点外,抹去与其余子女结点的分支连线。
3)以每个结点的做左端的子女结点为轴,顺时针转45度。
七、二叉树与树的区别?
1)树中结点的最大度数没有限制,而二叉树结点的最大度数为2;2)树的结点无左、右之分,而二叉树的结点有左、右之分。
3)树是一种简单的非线性结构,所有元素之间具有明显的层次特性。
4)在树结构中,每一个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点,简称树的根。每一个结点可以有多个后件,称为该结点的子结点。没有后件的结点称为叶子结点。
5)二叉树的特点:非空二叉树只有一个根结点,每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。
小结:通过比较让学习更加深刻
原文链接:/datastructure/382576.html