JAVA中的树(二叉树AND红黑树)
JAVA中在HashMap中,在JDK1.8之后,就出现了红黑树,那么我们就得研究一下这个数据结构了,毕竟框架都是对底层进行的封装,那么我们 一起看一下吧。
二叉树
二叉树:二叉树是每个节点最多有2个子树的一种数据结构。
我们画图来了解一下吧,毕竟画图比较清晰。
二叉树的最高层就是根节点,下面又有很多的子节点,25是15的父节点,而15又是25的子节点,其实就是一个相互的关系, 而15和44又是兄弟节点,但是有一点我们需要注意的地方就是叶子节点, 叶子节点则是红框里面的节点,就是没有子节点的我们就称它为叶子节点。
而在二叉树中,我们还要理解一个概念,这个概念就是“树的深度”
树深度:从根节点开始(深度为0)自最高层往下递增,在上面的图中我们可以知道,25的深度是0, 15和44深度是1,10,20,21和27的树深度是2,依次会递增。。
这是二叉树的几个我们需要了解的概念性的知识。
而二叉树也是有分类的:
满二叉树:
除最后一层无任何子节点外,每一层上的所有节点都有两个子节点,最后一层都是叶子节点。
- 假设我们树的深度是h,最大层数是k,那满二叉树就是h=k;
- 而我们满二叉树的叶子节点数也就是最后面的一层是2的k-1次方。
- 而二叉树的总节点数也一点会是奇数。
这也是满二叉树的性质。
完全二叉树
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
我们来看看图
- 完全二叉树只允许最后一层有空缺结点且空缺在右边,即叶子节点只能在层次最大的两层上出现;
- 而且对任意一个节点,如果其右子树的深度为j,则其左子树的深度必为j或j+1。 即度为1的点只有1个或0个;
- 有n个节点的完全二叉树,其深度为:log2的n+1次方;
- 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
平衡二叉树
又被称为AVL树,它是一颗空树或左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。
我们看一下图
二叉搜索树
二叉搜索树又称二叉查找树、二叉排序树(Binary Sort Tree)。
我们来看看它又是什么鬼样子。
- 二叉搜索树若左子树不空,则左子树上所有节点的值均小于或等于它的根节点的值;
- 左、右子树也分别为二叉排序树。
- 若右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;
还有就是在HashMap里面存在的红黑树
红黑树
红黑树就是每个节点都带有颜色属性,颜色或者是红色或者是黑色的平衡二叉查找树, 我们看看它是什么样子滴。
- 红黑树节点是红色或黑色;
- 根节点是黑色;
- 所有叶子节点都是黑色;
- 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
- 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点)。
我们再来看一下这个树结构是怎么实现遍历的?
二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。
用代码解释肯定是不太可能,毕竟代码写出来的都是模仿写的, 我们用画图来解释:
为什么会叫这个名字?是根据根节点的顺序命名的。
我们用最简单的图:
比如上图正常的一个满节点,A:根节点、B:左节点、C:右节点,
前序顺序是ABC(根节点排最先,然后同级先左后右);
中序顺序是BAC(先左后根最后右);
后序顺序是BCA(先左后右最后根)。
在我们上图中,见我们的前序,中序,后序遍历结构是什么呢?
前序遍历:A B C D E F G H I
中序遍历:B D C A E H G I F
后序遍历:D C B H I G F E A
总结
二叉树是一棵树,且每个节点都不能有多于两个的儿子,且二叉树的子树有左右之分,次序不能颠倒。 二叉树的遍历分为以下三种:
先序遍历:遍历顺序规则为【根左右】
中序遍历:遍历顺序规则为【左根右】
后序遍历:遍历顺序规则为【左右根】