JS 实现二叉树

140 阅读1分钟
  • 二叉链表的存储结构描述如下
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
}
}