目录
一,二叉树概念
- 由一个根节点,加上一颗左二叉树和一颗右二叉树组成,可以为空;
- 二叉树度不大于2;
- 二叉树子树有左右之分,次序不可颠倒,因此二叉树是有序树;
特殊二叉树
- 满二叉树,若每层节点数都达到最大值,如有k层,则节点总数为;
- 完全二叉树,如有k层,k-1层为满,最后一层从左到右为连续的二叉树,完全二叉树是效率很高的数据结构,是由满二叉树引出来的,满二叉树是特殊的完全二叉树;节点总数范围 ~ ;
二叉树的性质
- 若根节点为1层,则一颗非空二叉树第k层上最多个节点;
- 若根节点为1层,则深度为h的二叉树最多 - 1个节点;
- 若根节点为1层,则具有n个节点的满二叉树,其深度为;
- 任何一个二叉树,叶节点个数比度为2的节点数多1个;
- 对于具有n个节点的二叉树,如按从上到下、从左到右的顺序对所有节点从0编号,则对序号为i的节点,如下:
二,二叉树的存储结构
- 一般可使用两种结构存储,顺序结构或链式结构;
顺序存储
- 顺序存储即为数组存储,一般只适用表示完全二叉树,不完全二叉树会有空间浪费;
- 实际使用中,只有堆(一种二叉树)才会使用数组来存储;
- 物理上为数组,逻辑上是一颗二叉树;
注:数据结构中的栈和堆,与操作系统中内存区域划分的栈和堆;
链式存储
- 用链表来表示元素的逻辑关系,通常链表中每个节点有三个域组成(数据域、左右指针域);
- 链式结构可分为二叉链和三叉链;
//二叉链
typedef int BTDataType;
struct BinaryTreeNode
{
struct BinaryTreeNode* _pLeft; //指向左孩子节点
struct BinaryTreeNode* _pReft; //指向右孩子节点
BTDataType _data; //值域
}BinaryTreeNode;
//三叉链
typedef int BTDataType;
struct BinaryTreeNode
{
struct BinaryTreeNode* _pParent; //指向父节点
struct BinaryTreeNode* _pLeft; //指向左孩子节点
struct BinaryTreeNode* _pReft; //指向右孩子节点
BTDataType _data; //值域
}BinaryTreeNode;