js實現二叉查找樹


  二叉樹的特點:

      像一顆樹一樣,從頂端往下延伸,最頂端的為根節點,每個節點下面子節點的數不超過兩個,沒有任何子節點的節點被稱為葉子節點, 除了根節點和葉子節點的被稱為中間節點。

  二叉查找樹:

    每個節點的左子節點比 自身的值小, 又子節點比自身的值大。

 

  

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


    class BinaryTree{
        constructor() {
            this.root = null;
        }


        insert(key) {     // 插入數據
            var newNode = new Node(key);
            if (this.root == null) {
                this.root = newNode;
            } else {
                var current = this.root;
                while( true) {
                    if (key < current.key) {
                        if (current.left) {
                            current = current.left;
                        } else {
                            current.left = newNode;
                            break;
                        }
                    } else if (key > current.key) {
                        if (current.right) {
                            current = current.right;
                        } else {
                            current.right = newNode;
                            break;
                        }
                    }
                }
            }
        }


        centerSort(node,arr = []) {        // 中序排列
            if (node) {
                this.centerSort(node.left, arr);
                arr.push(node.key);
                this.centerSort(node.right,arr);
            }
            return arr;
        }

        prevSort(node, arr= []) {           // 前序排列
            if (node) {
                arr.push(node.key);
                this.prevSort(node.left, arr);
                this.prevSort(node.right, arr);
            }
            return arr;
        }

        nextSort(node, arr = []) {               // 后續排列
            if (node) {
                this.nextSort(node.left, arr);
                this.nextSort(node.right, arr);
                arr.push(node.key);
            }
            return arr;
        }

        getMin(node) {                // 獲取二叉樹的最小值
            node = node || this.root;
            while (node.left != null) {
                node = node.left;
            }
            return node.key;
        }

        getMax(node) {                //獲取二叉樹最大值
            node = node || this.root;
            while (node.right != null) {
                node = node.right;
            }
            return node.key;
        }

        find(key) {               // 查找 給定的值
            var node = this.root;
            while ( node != null) {
                if (key < node.key) {
                    node = node.left;
                } else if (key > node.key) {
                    node = node.right;
                } else {
                    return node;
                }
            }
            return null;
        }

        remove(key) {         // 刪除給定的值
            this.root = this.removeNode(this.root, key);
        }

        removeNode(node, key) {      // 真正刪除的函數
            if (node == null) {
                return  null;
            }
            if (key < node.key) {
                node.left = this.removeNode(node.left, key);
                return node;
            } else if (key > node.key) {
                node.right = this.removeNode(node.right, key);
                return node;
            } else {
                if (node.left == null && node.right == null) {
                    node = null;
                    return node;
                } else if (node.left == null) {
                    return node.right;
                } else if (node.right == null) {
                    return node.left;
                } else {
                    var minNode = this.getMin(node.right);
                    node.key = minNode.key;
                    node.count = minNode.count;
                    node.right = this.removeNode(node.right, minNode.key);
                    return node;
                }
            }
        }

    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM