二叉树

二叉树

子节点数<=2

非线性的数据结构

节点和节点的线,叫边

从一个节点到另一个节点的一组边,叫路径

树的层数,叫树的深度

以某种顺序遍历树,叫树的遍历

没有子节点的节点,叫叶子节点

 

二叉查询树

较小的数,放左节点,较大的数放右节点

二叉查询树的遍历方式:先序、中序、后序

先序:中、左、右

中序:左、中、右

后序:左、右、中

 

//节点
    function Node(data) {
        this.data = data
        this.left = null
        this.right = null
        this.count = 1
        this.show = () => {
            return this.data
        }
    }
    //二叉树查询树
    function bst() {
        this.root = null
        this.insert = insert
        this.remove = remove
        this.find = find
        this.len = 0
    }
    // bst的插入节点的方法
    function insert(data) {
        const newNode = new Node(data)
        this.len++
        if (this.root == null) {
            this.root = newNode
            return
        }
        let current = this.root
        while (true) {
            if (data < current.data) {
                if (current.left == null) {
                    current.left = newNode;
                    break;
                }
                current = current.left
            } else {
                if (current.right == null) {
                    current.right = newNode;
                    break;
                }
                current = current.right
            }
        }
    }
    //bst的删除节点的方法
    function remove(data) {
        removeNode(this.root, data)
    }
    function removeNode(node, data) {
        if (node.data == null) {
            return null
        }
        if (data == node.data) {
            //1.无子节点
            if (node.left == null && node.right == null) {
                return null
            }
            //无左子节点
            if (node.left == null) {
                return node.right
            }
            //无右子节点
            if (node.right == null) {
                return node.left
            }
            //有左右节点
            //找右节点树的最小,作为替换节点
            const rightMinNode = getMin(node.right)
            node.data = rightMinNode.data
            node.right = removeNode(node.right, rightMinNode.data)
            return node
        } else if (data < node.data) {
            node.left = removeNode(node.left, data)
            return node
        } else {
            node.right = removeNode(node.right, data)
            return node
        }

    }
    //查找
    function find(data) {
        if (this.root == null) return
        let current = this.root
        while (current) {
            if (data == current.data) {
                return current
            } else if (data < current.data) {
                if (!current.left) return null
                current = current.left
            } else {
                if (!current.right) return null
                current = current.right
            }
        }
    }
    //以数组为源数据创建bst,重复项计数
    function createTreeCount(arr) {
        const tree = new bst()
        arr.forEach(val => {
            const node = tree.find(val)
            if (node) {
                node.count++
            } else {
                tree.insert(val)
            }
        });
        return tree
    }
    //以数组为源数据创建bst,不查重
    function createTree(arr) {
        const tree = new bst()
        arr.forEach(val => {
            tree.insert(val)
        });
        return tree
    }
    //先序遍历
    function preOrder(node) {
        if (node != null) {
            console.log(node.data + ' ');
            preOrder(node.left)
            preOrder(node.right)
        }
    }
    //中序遍历
    function midOrder(node) {
        if (node != null) {
            midOrder(node.left)
            console.log(node.data + ' ');
            midOrder(node.right)
        }
    }
    //后序遍历
    function behindOrder(node) {
        if (node != null) {
            behindOrder(node.left)
            behindOrder(node.right)
            console.log(node.data + ' ');
        }
    }
    //计算节点数
    function countNode(node, count = 0) {
        if (node != null) {
            count = countNode(node.left, count)
            count++;
            count = countNode(node.right, count)
        }
        return count
    }
    //从 1开始算,找第几大的节点
    function findIndex(node, num) {
        let current = null
        function findN(node, count = 0) {
            if (node != null && !current) {
                count = findN(node.left, count)
                count++;
                if (count == num) current = node
                count = findN(node.right, count)
            }
            return count
        }

        findN(node)
        return current
    }
    //查找最小值
    function getMin(node) {
        let current = node
        while (current.left) {
            current = current.left
        }
        return current
    }
    //查找最大值
    function getMax(node) {
        let current = node
        while (current.right) {
            current = current.right
        }
        return current
    }
    //计算边数
    function countPath(node) {
        const count = countNode(node, 0)
        return count >= 0 && count - 1 || 0
    }
    // 所有的叶子节点
    function findLeafNode(node, arr = []) {
        if (node != null) {
            if (node.left == null && node.right == null) {
                arr.push(node)
            }
            if (node.left) {
                findLeafNode(node.left, arr)
            }
            if (node.right) {
                findLeafNode(node.right, arr)
            }
        }
        return arr
    }
    const arr = [3, 5, 22, 6, 14, 7, 1, 8, 35, 45, 26, 15, 95, 14, 0, 44, 66, 88]
    const tree1 = createTree(arr)
    const tree2 = createTreeCount(arr)
    midOrder(tree2.root)
    const number = 11
    console.log('第'+ number+'大的节点:', findIndex(tree2.root, number));
    // const num = countNode(tree1.root)
    // console.log('tree.length', num);
    // console.log('tree.length', tree1.len);
    // console.log('tree2.length', tree2.len);
    // const min = getMin(tree1.root)
    // console.log('min', min);
    // const max = getMax(tree1.root)
    // console.log('max', max);
    // tree1.remove(22)
    // midOrder(tree1.root)
    // const leaves = findLeafNode(tree1.root)
    // console.log('leaves',leaves);
    // console.log('tree1.root', tree1.root);
    // console.log('95', tree1.find(95));

  

  

posted @ 2021-08-06 20:00  baixinL  阅读(41)  评论(0编辑  收藏  举报