首先,我们要知道二叉树的产生原因
对于数组来说,它的搜索是非常方便的,下标就可以,而且时间复杂度位O(1),,但是他的插入和删除是比较麻烦的。
对于链表来说,它删除和插入元素很快,但查找很慢。
二叉排序树就是对于他们两个的一个折中方案,既有链表的好处,也结合了数组的好处。
二叉树理论上可以分为5种基本形态
一般二叉树来说,我们会说满二叉树,完全二叉树,二叉排序树和平衡二叉树
- 满二叉树 究极进化 完全二叉树
- 二叉排序树 究极进化 平衡二叉树
接下来分别看看这几树的区别
满二叉树
- 就是说只要一个二叉树每个节点都有左右孩子并且终端节点全部是满的,它就是一颗满二叉树;
- 满二叉树如果层数位K,,,,,,,,,,,那么它的节点位(2^K)-1;
- 同样的深度,满二叉树的节点是最多的;
-
完全二叉树
- 叶子节点再最后两层,而且最后一层叶子节点全部靠左,倒数第二层叶子节点全部靠右。
- 设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
- 同样的节点数,完全二叉树的高度最低的;
- 满二叉树是一个特殊的完全二叉树,但是完全二叉树却不是满二叉树。
-
二叉排序树
- 若左子树不空,左子树所有的节点均小于他的根节点,右子树不空,右子树君大于他的根节点
- 没有键值相等的节点
- 二叉排序树是一种动态树表,树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的结点时再进行插入。
平衡二叉树(AVL树)
- 左右子树的节点高度差不能大于1,如果插入一个节点破坏了这条特性的话,就需要进行旋转操作。
- 其他的和二叉排序树差不多
-
已知先序pre[] 和中序in[] 重构二叉树