一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第29天,点击查看活动详情。
目前在不断更新《数据结构算法》
未来会讲到《C++语言》,《Linux系统编程》,《Linux网络编程》,《MySQL数据库》等。
期待系统学习编程的小伙伴可以关注我!
1.二叉树概念及结构
1.1概念
一棵二叉树是结点的一个有限集合,该集合:
- 由一个根节点加上两棵别称为左子树和右子树的二叉树组成
- 或者为空
从上图可以看出:
-
二叉树不存在度大于2的结点
-
二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
注意:对于任意的二叉树都是由以下几种情况复合而成的
1.2现实中的二叉树:
正常人:这树长得真对称,真标准! 程序员:卧槽,这不是满二叉树吗?
1.3 特殊的二叉树:
- 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2的K次方减1 ,则它就是满二叉树。
- 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。完全二叉树的前K-1层是满的,最后一层不满,但最后一层从左往右是连续的。
1.4 二叉树的性质
-
若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2的(i-1)次方个结点。
-
若规定根节点的层数为1,则深度为h的二叉树的最大结点数是
.
-
对任何一棵二叉树, 如果度为0其叶结点个数为n0 , 度为2的分支结点个数为n2 ,则有 n0=n2+1
-
若规定根节点的层数为1,具有n个结点的满二叉树的深度,
(ps: 是log以2为底,n+1为对数)
-
对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
-
若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
-
若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
-
若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子
1.5 二叉树的存储结构
二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。
- 顺序存储
顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
- 链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是 链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所 在的链结点的存储地址 。
==链式结构又分为二叉链和三叉链==,当前我们学习中一般都是二叉链,后面课程学到高阶数据结构如红黑树等会用到三叉链
typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pParent; // 指向当前节点的双亲
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
};
- 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( ) A 不存在这样的二叉树 B 200 C 198 D 199
- 下列数据结构中,不适合采用顺序存储结构的是( ) A 非完全二叉树 B 堆 C 队列 D 栈
- 在具有 2n 个结点的完全二叉树中,叶子结点个数为( ) A n B n+1 C n-1 D n/2
- 一棵完全二叉树的节点数位为531个,那么这棵树的高度为( ) A 11 B 10 C 8 D 12
- 一个具有767个节点的完全二叉树,其叶子节点个数为() A 383 B 384 C 385 D 386
答案:
- B(n0 = n2 +1 = 199+1 = 200)规则请见二叉树的性质第三条
- A
- A 正经解法: 假设度为0 有n0个 假设度为1 有n1个 假设度为2 有n2个 2n = n0+n1+n2 = n0 + n1 + n0-1 = 2*n0 + n1-1 完全二叉树n1为1或0 因为这个个数是整数,上面公式要满足,n1只能为1 解得n0 = n 取巧解法: 假设n = 1 总共2个节点,其中叶子节点只有1个,答案是n
- B
设高度为h 最多:2^h-1 最少:2^(h-1)-1+1(最后一层至少要有1个) 套个数据进去试
- B 跟第三题方法一样
这章初步介绍了数和二叉树的概念,以后会经常用到其中的部分概念,概念是一切的基础,概念不清更别提做出题了,大家加油!