0
点赞
收藏
分享

微信扫一扫

二叉树搜索树的插入、删除、查找【迭代法】

fbd4ffd0717b 2022-03-30 阅读 17
javascript

//二叉树节点

class Node {
    data = null
    left = null
    right = null
    constructor(key) {
        this.data = key;
    }

}

//树
class Tree {
    root = null
    count = null

    find(data) {
        let currentNode = this.root
        while (currentNode) {
            if (currentNode.data === data) {
                return currentNode
            }
            if (currentNode.data > data) {
                currentNode = currentNode.left
            } else if (currentNode.data < data) {
                currentNode = currentNode.right
            }
        }
        return false

    }

    insert(data) {
        this.count++;
        //如果第一个节点为空 设置第一个节点
        let newNode = new Node(data);
        if (this.root == null) {
            this.root = newNode;
            return true;
        }
        let current = this.root;
        let parentNode = this.root; //引用传递
        while (current !== null) {
            parentNode = current
            if (current.data > newNode.data) {
                current = current.left
                if (current === null) {
                    parentNode.left = newNode
                }
            } else {
                current = current.right
                if (current === null) {
                    parentNode.right = newNode
                }
            }
        }


        return false;
    }

    /**
     * 删除共三种情况
     * 1 该节点是叶子节点
     * 2 该节点有一个叶子节点
     * 3 该节点有两个叶子节点
     *
     * @param data
     */

    delete(data) {
        let current = this.root;
        let parentNode = this.root;
        //当前节点是否为左节点
        let isLeftNode = false;

        if (this.root && data === this.root.data) {
            this.root = null;
        }
        //定位data的位置
        while (current.data != data) {
            parentNode = current;
            if (current.data > data) {
                isLeftNode = true;
                current = current.left;
            } else {
                isLeftNode = false;
                current = current.right;
            }
            if (current == null) {
                return false;
            }
        }
        this.count=this.count-1

        //来到这里代表找到了父节点和他本身节点
        // 1 第一种情况 此节点为叶子节点
        if (current.left === null && current.right === null) {
            if (isLeftNode) {
                //如果要删除的节点为父节点的左节点 把父节点的左节点置为空
                parentNode.left = null;
            } else {
                parentNode.right = null;
            }
            return true;
        }
        //2 当前节点有一个节点

        if (current.left == null && current.right != null) {
            if (isLeftNode) {
                parentNode.left = current.right;
            } else {
                parentNode.right = current.right;
            }
            return true
        } else if (current.left != null && current.right == null) {
            if (isLeftNode) {
                parentNode.left = current.left;
            } else {
                parentNode.right = current.left;
            }
            return true

        }

        //3 当前节点有两个节点

        if (current.left != null && current.right != null) {
            let rightNode = current.right;
            let leftNode = current.left;
            let tempParentNode = null;
            let tempRightNode = current.right
            while (tempRightNode != null) {
                tempParentNode = tempRightNode
                tempRightNode = tempRightNode.left;
            }
            tempParentNode.left = leftNode
            if (isLeftNode) {
                parentNode.left = rightNode;
            } else {
                parentNode.right = rightNode;
            }
            return true
        }
        return false
    }


}

const tree = new Tree()
tree.insert(2)
tree.insert(1)
tree.insert(7)
tree.insert(5)
tree.insert(9)
tree.insert(4)
tree.insert(6)
tree.insert(8)
tree.insert(10)
tree.delete(5)
console.log(tree);
举报

相关推荐

0 条评论