个人小博客-》 :欢迎来到我的领域 /** * 递归方式在插入后自平衡 2022-10-10 众人皆醒吾独醉 ---吾本孤立无援 */ private void balanceInsertRecursion(RbTreeNode node) { if (node.getParent() == null) { this.root = node; return; } if (node.getParent().getParent() == null) { return; } // RbTreeNode thisNodeFather = node.getParent(); if (thisNodeFather.color) { //红色才违背,才需要调整 return; } //他爷 RbTreeNode thisNodeGdFather = node.getParent().getParent(); //他叔还未知 RbTreeNode thisNodeUncle = null; //用于确定位置 0 =l 1= r int fatherIsLeftOrRightChild = -1; int nodeIsLeftOrRightChild = -1; //定位father 、找叔 if (thisNodeFather.equals(thisNodeGdFather.getLeftChild())) { fatherIsLeftOrRightChild = 0; thisNodeUncle = thisNodeGdFather.getRightChild(); } else { fatherIsLeftOrRightChild = 1; thisNodeUncle = thisNodeGdFather.getLeftChild(); } if (node.equals(thisNodeFather.getLeftChild())) { nodeIsLeftOrRightChild = 0; } else { nodeIsLeftOrRightChild = 1; } //开始调整 if (thisNodeUncle != null && !thisNodeUncle.color) { //他叔为红--只需要染色即可 thisNodeFather.color = true; thisNodeUncle.color = true; thisNodeGdFather.color = false; //以gdfather继续向上递归 balanceInsertRecursion(thisNodeGdFather); } else { //这时候不能简单染色了,需要双旋或单旋,平衡节点,旋转得按上方节点定位 判断 做左旋还是右旋。 if (0 == fatherIsLeftOrRightChild) { if (1 == nodeIsLeftOrRightChild) { //双旋 leftRotate(thisNodeFather); } rightRotate(thisNodeGdFather); //gdfather 必为黑 右旋后会 在右多一黑,所以得变红,插入点旋到 gd得位置,得变黑 node.setColor(true); thisNodeGdFather.setColor(false); } else { if (0 == nodeIsLeftOrRightChild) { rightRotate(thisNodeFather); } leftRotate(thisNodeGdFather); node.setColor(true); thisNodeFather.setColor(false); } } //保证根为黑 this.root.setColor(true); }
红黑树树插入后自平衡
于 2022-10-19 14:54:22 首次发布