ES6深拷贝重写红黑树旋转
灵感来源:在学习红黑树旋转方法的时候,我们写的旋转绝大部分都是以浅拷贝的方式来实现的,这样指针的指向的逻辑对初学者来说可能有些混乱,于是我尝试着用深拷贝的方法实现了一下红黑树的旋转,以下以左旋为例子
浅拷贝:
leftRotate(node) {
let newNode=node.right
node.right=newNode.left
if(newNode!==null){
newNode.left.parent=node
}
newNode.parent=node.parent
if(node.parent!==null){
if(node.parent.left===node){
node.parent.left=newNode
}else{
node.parent.right=newNode
}
}else{
this.root=newNode
}
node.parent=newNode
newNode.left=node
}
深拷贝会利用到es6的展开运算符,用法可以参考MDN关于构造字面量时使用展开语法的举例
代码:
leftRotate(node) {
let rNode = {...node.right};
if (rNode.left ) {
node.right ={...rNode.left};
node.right.parent=node;
}
if (node.parent) {
rNode.parent = {...node.parent};
if (node.parent.right === node) {
node.parent.right = {...rNode};
} else {
node.parent.left = {...rNode};
}
} else {
this.root = {...rNode};
}
node.parent = {...rNode};
rNode.left = node;
}
上述代码中如rNode = {…node.right}就是将node.right的属性拷贝到rNode中,而不是像之前一样赋值内存地址,这样一来我们就可以用更直接的思维去实现红黑树的旋转
ps:这样会使红黑树在输出的时候节点展示变成对象展示,即它的节点变成一个新的对象而不是红黑树节点类的实例对象,此问题有待解决