- 二叉链表的存储结构描述如下
class Node{
constructor(data, left, right){
this.data = data
this.left = left
this.right = right
this.count = 1
}
由于二叉树没有键值相同的节点 如果插入时有相同节点值 就把 count 自增 1
- 二叉排序树
class BSTree{
constructor(){
this.root = null
}
_removeNode(node, data){}
remove(node, data) { this.root = this._removeNode(node, data) }
insert(data){}
find(data){}
MinNode(node = this.root){}
MaxNode(node = this.root){}
}
- 具体实现
-
- insert
// 向二叉树中插入节点
insert(data) {
let newNode = new Node(data, null, null);
if (this.root == null) {
this.root = newNode;
} else {
let currNode = this.root;
let parentNode = null;
while (true) {
parentNode = currNode;
if (newNode.data < currNode.data) {
currNode = currNode.left; // 更新当前指点的指向
if (!currNode) { // 当前节点为空时,说明找到了正确的插入位置
parentNode.left = newNode;
break;
}
} else if (newNode.data > currNode.data) {
currNode = currNode.right; // 更新当前指点的指向
if (!currNode) { // // 当前节点为空时,说明找到了正确的插入位置
parentNode.right = newNode;
break;
}
} else if (newNode.data == currNode.data) {
// 如果给定的数据再次出现,就更新计数值
currNode.count++;
break;
}
}
}
}
-
- MinNode
MinNode(node){
let currentNode = node
while(currentNode.left){
currentNode = currentNode.left
}
return currentNode
}
-
- MaxNode
MaxNode(node){
let currentNode = node
while(currentNode.right){
currentNode = currentNode.right
}
return currentNode
}
-
- find
find(data){
let currentNode = this.root
while(currentNode)
{
if(currentNode.data === data) { return currentNode }
if(currentNode.data < data) { currentNode = currentNode.right }
else if(currentNode.data < data) { currentNode = currentNode.left }
}
return null
}
删除节点分为三种情况:
- 待删除节点是叶子节点 --返回null
- 待删除节点只有左节点 -- 返回左节点
- 待删除节点只有右节点 -- 返回右节点
- 待删除节点左右都有 -- 删除左子树最大值 或者删除右子树最小值, 同时将删除的节点值替换待删除节点
-
- _removeNode
_removeNode(Node, data) {
if(Node.data === data){
if(Node.left === Node.right){return null} //叶子节点
if(Node.left === null){return Node.right} // 只有右节点
if(Node.right === null){return Node.left} // 只有左节点
temNode = MinNode(Node)
Node.data = temNode.data
Node.right = _removeNode(Node.right, temNode.data)
return Node
} else if(Node.data < data){
Node.right = _removeNode(Node.right, data)
return Node
}
else if(Node.data > data){
Node.left = _removeNode(Node.left, data)
return Node
}
}