一,什么是树
树是一种具有层次性的数据结构,由于它具有分层次的特点使得通过树在管理上具有更高的效率。
定义:实质上就是有n个结点构成的有限集合(当n=0时称该树为空树)
非空树(n!=0)的性质:
1,树中有一个称为“根”的特殊结点,用r表示;
2,其余的每个结点又被分为互不相交的有限集,而每个集合本身又可以成为树,称作原来树的“子树”(子树互不相交);
树的基本术语:
二,树的表示
我们可以思考一下,用链表或数组的形式来实现树这么一种数据结构。如果用数组的话,由于树多层次性和多分枝的特点导致只能顺序存储的数组无法实现,这种办法pass。那我们就将目光转向链表,但是由于树不同结点的子树个数的不同,使得树上不同结点指针不同,导致链表的指针个数无法统一,难以实现,好嘛,那就一不做二不休,把所有链表的指针个数都设置为这棵树拥有最多结点的根的个数,但是这样一来就会造成巨大的空间损失。
因此可以采用一种新的链表的形式——儿子兄弟表示法
在这种表示方法下,每个结点的结构统一,都是有两个指针,同时这种方法空间损失不大。且它每个结点有两个“儿子”,因此我们将它命名为“二叉树” 。
三,二叉搜索树
回想之前所学的顺序查找和二分法查找,我们明白二分查找的速度会快很多,但是由于二分查找是在数组中实现的,因此对数组中的元素进行增添和删除非常困难,那用什么办法可以又快的搜寻我们想要的结果又可以方便的完成增添和删除呢?是的,由于树本质是通过链表实现的,我们可以通过树的形式进行实现。
我们可以构建一种树,这棵树根左边的结点都小于右边的结点,这样既方便我们查找又方便我们进行操作。
满二叉树:在一棵二叉树中,如果所有分支结点都有左、右孩子结点,并且叶子结点都集中在二叉树的最下层,这样的二叉树称为满二叉树。
完全二叉树:若二叉树中最多只有最下面两层的结点的度可以小于2,并且最下面一层的叶子结点都依次排列在该层最左边的位置上,则这样的二叉树称为完全二叉树。
特点:二叉搜索树的所有非空左子树的键值都比根节点要小;
所有非空右子树的键值都比根节点要大;
且左右子树都是二叉搜索树;