JAVA之树的详解
度:每一个结点的子节点数量
树高:树的总层数
根节点:最顶层的节点
左子节点:左下方的节点
右子节点:右下方的节点
二叉查找树
特点
-
每一个节点上最多有两个子节点
-
任意节点左子树上的值都小于当前节点
-
任意节点右子树的值都大于当前节点
添加节点规则
-
小的存左边
-
大的存右边
-
一样的不存
遍历
-
前序遍历:当前节点 左子节点 右子节点
-
中序遍历:左子节点 当前节点 右子节点
-
后序遍历:左子节点 右子节点 当前节点
-
层序遍历:一层一层的去遍历
平衡二叉树
规则:任意节点左右子树高度差不超过1
左旋
-
以不平衡的点作为支点
-
把支点左旋降级,变成左子节点
-
晋升原来的右子节点
-
以不平衡的点作为支点
-
将根节点的右侧往左拉
-
原来的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点
平衡二叉树需要旋转的四种情况
-
左左:当根节点左子树的左子树有节点插入,导致不平衡(一次右旋)
-
左右:当根节点左子树的右子树有节点插入(先局部左旋,再整体右旋)
-
右右:根节点右子树的右子树有节点插入(一次左旋)
-
右左:根节点右子树的左子树有节点插入(局部右旋,再整体左旋)
红黑树
-
是一个二叉查找树
-
但不是高度平衡的
-
条件:特有的红黑规则
规则:
-
每一个节点是红色或黑色的
-
根节点必须是黑色
-
如果一个节点没有子节点或父节点,则该节点相应的指针属性值为NIL,这些NIL视为叶节点
-
两个红色节点不能相连
-
任意节点到所有后代叶结点的简单路径上,黑色节点数量相同
添加节点
默认颜色是红色效率高
根——>直接变黑色
|————>父黑色(不操作)
|
| |——>叔叔红色 1. 将父设为黑色,将叔设为黑色
非根 | 2. 将祖父设为红色
| | 3. 如果祖父为根,再将根变回黑色
| | 4. 如果祖父非根,将祖父设为当前节点再判断
| |
|————>父红色————>叔叔黑色(当前节点时父的右孩子)—>把父设为当前节点并左旋再进行判断
|
|——>叔叔黑色(当前节点是父的左孩子)—>1. 将父设为黑色
2.将祖父变为红色
3.以祖父为支点右旋
红黑树的增删改查性能很好