2019-07-16 二叉搜索树

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    //  二叉搜索树
    let Node = function (value) {
        this.value = value;
        this.right = null;
        this.left = null;
        this.isFirst = false;
    };

    class BST {
        constructor(value) {
            let node = new Node(value);
            this.root = node;
            this.count = 0;
        }

        size() {
            return this.count
        }

        isEmpty() {
            return this.count === 0
        }

        insert(value) {
            if (this.root === null) {
                this.root = new Node(value);
                this.count = 1;
            } else {
                this.root = this._insert(this.root, value);
                this.count++
            }
        }

        _insert(node, value) {
            if (node === null) {
                return new Node(value)
            }
            if (node.value === value) {
                return;
            } else if (value < node.value) {
                node.left = this._insert(node.left, value)
            } else {
                node.right = this._insert(node.right, value)
            }
            return node;
        }

        contain(value) {
            return this._contain(this.root, value)
        }

        _contain(node, value) {
            if (node === null) return false
            if (node.value === value) {
                return true
            } else if (node.left && node.value > value) {
                return this._contain(node.left, value)
            } else if (node.right && node.value < value) {
                return this._contain(node.right, value)
            }
        }

        search(value) {
            return this._search(this.root, value)
        }

        _search(node, value) {
            if (node === null) return null

            if (node.value === value) {
                return node.value
            } else if (node.left && node.value > value) {
                return this._search(node.left, value)
            } else if (node.right && node.value < value) {
                return this._search(node.right, value)
            }
            return null
        }

        preOrder(node) {
            if (node !== null) {
                console.log(node.value)
                this.preOrder(node.left)
                this.preOrder(node.right)
            }
        }

        preOrderNR(node) {
            if (!node) return;
            let stack = [],
                root;
            stack.push(node);
            while (stack.length) {
                root = stack.pop();
                if (root.right) stack.push(root.right);
                if (root.left) stack.push(root.left);
                console.log(root.value)
            }
        }

        preOrderMorris(node) {
            if (!node) return null;

            let pre;
            while (node) {
                if (!node.left) {
                    console.log(node.value);
                    node = node.right;
                } else {
                    pre = node.left;
                    while (pre.right && pre.right !== node) {
                        pre = pre.right;
                    }
                    if (!pre.right) {
                        console.log(node.value);
                        pre.right = node;
                        node = node.left
                    } else {
                        node = node.right;
                        pre.right = null;
                    }
                }
            }
        }

        inOrder(node) {
            if (node !== null) {
                this.inOrder(node.left);
                console.log(node.value);
                this.inOrder(node.right)
            }
        }

        inOrderNR(node) {
            if (!node) return
            let stack = [],
                root;
            while (true) {
                while (node) {
                    stack.push(node);
                    node = node.left
                }

                if (!stack.length) break;
                root = stack.pop();
                console.log(root.value);
                root = root.right;
            }
        }

        inOrderMorris(node) {
            if (!node) return null;

            let pre;
            while (node) {
                if (!node.left) {
                    console.log(node.value)
                    node = node.right
                } else {
                    pre = node.left
                    while (pre.right && pre.right !== node) {
                        pre = pre.right
                    }
                    if (!pre.right) {
                        pre.right = node
                        node = node.left
                    } else {
                        console.log(node.value)
                        node = node.right
                    }
                }

            }
        }

        postOrder(node) {
            if (node !== null) {
                this.postOrder(node.left)
                this.postOrder(node.right)
                console.log(node.value)
            }
        }

        postOrderNR(node) {
            if (!node) return;
            let stack = [],
                currNode = node,
                rightNode = null;
            stack.push(currNode)
            while (stack.length) {
                while (currNode.left) {
                    stack.push(currNode.left)
                    currNode = currNode.left;
                }
                currNode = stack.pop()
                while (!currNode.right || currNode.right === rightNode) {
                    console.log(currNode.value)
                    rightNode = currNode
                    currNode = stack.pop()
                }
                stack.push(currNode)
                currNode = currNode.right

            }
        }

        reverse(p1, p2) {
            if (p1 === p2) return;

            let x = p1,
                y = p1.right,
                temp;
            while (true) {
                temp = y.right;
                y.right = x;
                x = y;
                y = temp;
                if (x === p2) break;
            }
        }

        printReverse(p1, p2) {
            this.reverse(p1, p2);

            let pNode = p2;
            while (true) {
                console.log(pNode.value);
                if (pNode === p1) break;
                pNode = pNode.right;
            }

            this.reverse(p2, p1);
        }

        postOrderMorris(node) {
            if (!node) return;
            let root = new Node(null),
                pre;
            root.left = node;
            while (root) {
                if (!root.left) {
                    root = root.right;
                } else {
                    pre = root.left;
                    while (pre.right && pre.right !== root) {
                        pre = pre.right;
                    }
                    if (!pre.right) {
                        pre.right = root;
                        root = root.left;
                    } else {
                        this.printReverse(root.left, pre);
                        pre.right = null;
                        root = root.right
                    }
                }
            }
        }

        miniNum(node) {
            if (!this.root) return;
            while (node) {
                if (!node.left) {
                    return node
                }
                node = node.left
            }
        }

        removeMin(node) {
            let pNode = node,
                minNode = node.left,
                rightNode = null;
            while (minNode && minNode.left) {
                pNode = pNode.left
                minNode = minNode.left
            }
            if (minNode.right) {
                rightNode = minNode.right
            }
            pNode.left = rightNode
            return node;
        }

        maxNum(node) {
            if (!this.root) return;
            while (node) {
                if (!node.right) {
                    return node;
                }
                node = node.right
            }
        }

        removeMax(node) {
            let pNode = node,
                maxNode = node.right,
                leftNode = null;
            while (maxNode && maxNode.right) {
                pNode = pNode.right
                maxNode = maxNode.right
            }
            if (maxNode.left) {
                leftNode = maxNode.left
            }
            pNode.right = leftNode
            return node;
        }

        remove(node, e) {
            this.root = this._remove(node, e);
            this.count--;
        }

        _remove(node, e) {
            if (!node) return null;

            if (node.value > e.value) {
                node.left = this._remove(node.left, e);
            } else if (node.value < e.value) {
                node.right = this._remove(node.right, e);
            } else {
                if (node.left === null) {
                    let rightNode = node.right;
                    node.right = null;
                    return rightNode;
                } else if (node.right === null) {
                    let leftNode = node.left;
                    node.left = null;
                    return leftNode;
                }
                let successor = this.miniNum(node.right);
                successor.right = this.removeMin(node.right);
                successor.left = node.left;
                node.left = node.right = null;
                return successor;
            }
        }


        levelOrder() {
            let queue = [];
            queue.push(this.root);
            while (queue.length) {
                let node = queue.shift();
                console.log(node.value);
                if (node.left) queue.push(node.left);
                if (node.right) queue.push(node.right);
            }
        }
    }


</script>
</body>
</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,572评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,071评论 3 414
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,409评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,569评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,360评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,895评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,979评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,123评论 0 286
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,643评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,559评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,742评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,250评论 5 356
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,981评论 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,363评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,622评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,354评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,707评论 2 370

推荐阅读更多精彩内容