二叉树排序树(二叉搜索树)
- 左子树都小于根节点值
- 右子数都大于根节点值
- 中序遍历为升序排序
操作
添加
23 -> 10 -> 17
删除
-
删除度为0的节点6
-
删除度为1的节点10
将子节点移交给父节点 -
💖 删除度为2的节点
- 找到当前节点的前驱或者后继节点(中序遍历中的前一个或或一个节点)
- 将其与当前节点值互换
- 删除前驱节点(转换为删除度为0或1的节点)
const Node = function(key) {
this.key = key
this.left = null
this.right = null
}
class BinarySortTree {
constructor() {
this.root = null
}
preDeccessor(node) {
let temp = node.left
while(temp.right) temp = temp.right
return temp
}
inorder(node) {
if (!node) return
this.inorder(node.left)
console.log(node.key)
this.inorder(node.right)
}
output() {
this.inorder(this.root)
}
insertNode(root, key) {
if (!root) {
const newNode = new Node(key)
return newNode
}
if (root.key === key) return root
if (root.key > key) root.left = this.insertNode(root.left, key)
else root.right = this.insertNode(root.right, key)
return root
}
deleteNode(root, key) {
if (!root) return null
if (root.key > key) {
root.left = this.deleteNode(root.left, key)
} else if (root.key < key) {
root.right = this.deleteNode(root.right, key)
} else {
// 度为0或者度为1
if (!root.left || !root.right) {
const child = root.left ? root.left : root.right
return child
} else {
const prev = this.preDeccessor(root)
root.key = prev.key
root.left = this.deleteNode(root.left, prev.key)
}
}
return root
}
add(key) {
this.root = this.insertNode(this.root, key)
}
delete(key) {
this.root = this.deleteNode(this.root, key)
}
}
AVL树
回溯时左右子树不平衡(两者高度差大于1)时,进行调整
🐱🐉 实例:5 9 8 3 2 4 1 7
-
依次插入5,9,8
-
5节点处RL型失衡,先拽着9进行小右旋,再拽着5进行大左旋
-
依次插入3,2
-
5节点处LL型失衡,拽着5进行大右旋
-
插入4
-
8节点处LR型失衡,拽着3进行小左旋,再拽着8进行大右旋
-
依次插入1,7