二叉树的概念
最近学习了二叉树这个数据结构,二叉树,顾名思义,它的存储结构看上去就是一个最多分两个叉的树,如下图,就是一颗经典的二叉树
在二叉树中,每个节点最多有一个前驱节点,最多有两个后区节点,我们把前驱节点叫做父节点,后驱节点叫做子节点,如上图中,节点A是节点B的父节点,同时B节点是A节点的左子节点,子节点根据它的所在位置分为左右节点。
二叉树的存储方式
那么二叉树在计算机内怎么存储呢?有好几种存储方式:
1.利用数组顺序存储二叉树
首先声明,日常使用二叉树基本不会用数组存储,因为数组存储二叉树,一般是层序遍历着去存储,我们在存储有效节点的同时也要把空节点对应的数组空间空着,做一个特殊标记,表示这是一个空节点,如果我们不存储空节点,我们在再次查询二叉树内容的时候这个二叉树就无序了,我们无法知道这个下标对应的值是哪一个节点,所以非常浪费内存空间,除非这是一个完全二叉树,下面给出百度百科对完全二叉树的定义
完全二叉树
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。如下图就是一颗完全二叉树:
简单来说就是层序遍历这颗二叉树(假设空节点也会被遍历到),一直到最后一个节点为止,中间每个节点都不是空节点。这样的二叉树利用数组存储就非常合适,不浪费一点空间,但我们常用到的二叉树很少有完全二叉树,所以数组存储做一个了结就好。
2.利用链式结构存储二叉树
所谓链式结构存储二叉树,就是利用链表的构造方式,每个节点都设两个左右子树指针,同时本身也有一个值,如下面C++的常用二叉树结构
struct node{
int val;//当前节点的值
struct node *left;//指向左子树的指针
struct node *right;//指向右子树的指针
};
这是比较常用的二叉树存储方式,因为它每生成一个节点都是在堆中申请一个节点大小的空间赋值给指针变量,并且他不像数组那样必须要连续的空间来存储,在堆中申请空间见缝插针即可,更高效率的利用了内存。
二叉树的种类
1.二叉搜索树
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。