营销软件网站建设做网站要学会什么软件
营销软件网站建设,做网站要学会什么软件,周口建设网站,渭南网站建设seo2-3查找树
2-结点#xff1a;含有一个键(及其对应的值)和两条链#xff0c;左链接指向2-3树中的键都小于该结点#xff0c;右链接指向的2-3树中的键都大于该结点。
3-结点#xff1a;含有两个键(及其对应的值)和三条链#xff0c;左链接指向的2-3树中的键都小于该结点含有一个键(及其对应的值)和两条链左链接指向2-3树中的键都小于该结点右链接指向的2-3树中的键都大于该结点。
3-结点含有两个键(及其对应的值)和三条链左链接指向的2-3树中的键都小于该结点中链接指向的2-3树中的键都位于该结点的两个键之间右链接指向的2-3树中的键都大于该结点。 查找判断一个键是否在树中先和根节点的键比较如果相等查找命中如果不同根据比较结果在其子树中继续查找。还是空连接查找未命中。
插入
1.向2-结点插入首先进行查找将结点挂载未找到的结点上如果未找到的结点是一个2-结点将新元素放到里面变成3-结点。
2.向3-结点插入将元素放入3-节点变成4-结点将4-结点中间元素提升小于中间元素作为左节点大于中间元素作为右结点。树的高度加1。
3.向父节点为2-结点子结点为3-结点中插入将元素插入3-结点中变成临时的4-结点。将结点中的中间元素提升到2-结点中父节点从2-结点变成3-结点将左右元素挂载到适当的位置。
4.向父子结点为3-结点中插入将元素插入子结点3-结点中变成临时的4-结点。提升中间元素将父节点从3-结点变成4-结点将左右元素放到适当位置。将父节点中的中间元素提升直到遇到一个父节点是2-结点将其变成3-结点为止就可以了。
5.当插入时所有结点都是3-结点时将根节点变成一个临时4-结点将根节点拆分成两个2-结点。树高度1.
性质
1.任意空链接到根结点的路径长度都是相等的。 2. 4-结点变换为3-结点时树的高度不会发生变化只有当根结点是临时的4-结点分解根结点时树高1。 3. 2-3树与普通二叉查找树最大的区别在于普通的二叉查找树是自顶向下生长而2-3树是自底向上生长。 直接实现2-3查找树较为复杂但是其概念有利于红黑树、B树、B树。
红黑树
红黑树主要是对2-3树进行编码红黑树背后的基本思想是用标准的二叉查找树(完全由2-结点构成)和一些额外的信息(替换3-结点)来表示2-3树。我们将树中的链接分为两种类型 红链接将两个2-结点连接起来构成一个3-结点 黑链接则是2-3树中的普通链接。
红黑树定义
1. 红链接均为左链接 2. 没有任何一个结点同时和两条红链接相连 3. 该树是完美黑色平衡的即任意空链接到根结点的路径上的黑链接数量相同
其实就是将3-结点中的两个键分开中间用红色连接
private class NodeKey,Value{
//存储键
public Key key;
//存储值
private Value value;
//记录左子结点
public Node left;
//记录右子结点
public Node right;
//由其父结点指向它的链接的颜色
public boolean color;
public Node(Key key, Value value, Node left,Node right,boolean color) {
this.key key;
this.value value;
this.left left;
this.right right;
this.color color;
}
}
对红黑树进行增删改时可能出现两条红链接需要进行旋转修复。
1.左旋
场景某个结点的左子节点为黑色右子节点为红色需要左旋
左旋过程 1.让x的左子结点变为h的右子结点h.rightx.left; 2.让h成为x的左子结点x.lefth; 3.让h的color属性变为x的color属性值x.colorh.color; 4.让h的color属性变为REDh.colortrue; 2.右旋
场景某个结点的左子节点以及左子节点的左子节点都是红链接。
右旋过程 1. 让x的右子结点成为h的左子结点h.left x.right; 2. 让h成为x的右子结点x.righth; 3. 让x的color变为h的color属性值x.color h.color; 4. 让h的color为RED 插入
1.向单个2-结点中插入新键小于当前结点的键时新增红色结点。如果大于新增红色右链接左旋。 2.向底部的2-结点插入在树的底部新增一个结点通过红链接相连父节点为2-结点时上面方法使用。
3.颜色反转当一个结点的左右子结点为红链接时将左右链接变成黑链接与父节点的链接变成红链接。
4.向3-结点中插入大于结点中的两个键时向右插入颜色反转小于两个键时向左插入右旋颜色反转介于两个键中间在中间插入左旋右旋颜色反转。
5.向底部3-结点插入新节点链接是3-结点的右链接只需要转换颜色左链接时右旋颜色转换中链接时左旋右旋颜色转换。
左旋
private Node rotateLeft(Node h) {
//找出当前结点h的右子结点
Node hRight h.right;
//找出右子结点的左子结点
Node lhRight hRight.left;
//让当前结点h的右子结点的左子结点成为当前结点的右子结点
h.right lhRight;
//让当前结点h称为右子结点的左子结点
hRight.left h;
//让当前结点h的color编程右子结点的color
hRight.color h.color;
//让当前结点h的color变为RED
h.color RED;
//返回当前结点的右子结点
return hRight;
}
右旋
private Node rotateRight(Node h) {
//找出当前结点h的左子结点
Node hLeft h.left;
//找出当前结点h的左子结点的右子结点
Node rHleft hLeft.right;
//让当前结点h的左子结点的右子结点称为当前结点的左子结点
h.left rHleft;
//让当前结点称为左子结点的右子结点
hLeft.right h;
//让当前结点h的color值称为左子结点的color值
hLeft.color h.color;
//让当前结点h的color变为RED
h.color RED;
//返回当前结点的左子结点
return hLeft;
}
颜色反转
private void flipColors(Node h) {
//当前结点的color属性值变为RED
h.color RED;
//当前结点的左右子结点的color属性值都变为黑色
h.left.color BLACK;
h.right.color BLACK;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89018.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!