数据结构之二叉搜索树(BST)--JavaScript实现

简介: 数据结构之二叉搜索树(BST)--JavaScript实现

原理:

叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树存储结构中序遍历二叉排序树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。每次插入的新的结点都是二叉排序树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索,插入,删除的复杂度等于树高,O(log(n)).

JavaScript实现:

var BinarySearchTree = function(){
            this.root = null;
        }
        BinarySearchTree.prototype = {
            insert: function(key){//插入
                var newNode = new this.Node(key);
                if(this.root === null){
                    this.root = newNode;
                }else{
                    this.insertNode(this.root, newNode)
                }
                console.log(this.root)
            },
            inOrderTraverse: function(callback){//中序查找
                this.inOrderTraverseNode(this.root, callback);
            },
            preOrderTraverse: function(callback){//先序查找
                this.preOrderTraverseNode(this.root, callback);
            },
            postOrderTraverse: function(callback){//后序查找
                this.postOrderTraverseNode(this.root, callback);
            },
            min: function(){//最小值
                return this.minNode(this.root)
            },
            max: function(){//最大值
                return this.maxNode(this.root)
            },
            search: function(key){//查找
                this.searchNode(this.root, key)
            },
            remove: function(key){//移除树节点
                this.removeNode(this.root, key)
            },
            Node: function(key){
                this.key = key;
                this.left = null;
                this.right = null;
            },
            insertNode: function(node, newNode){
                if(newNode.key < node.key){
                    if(node.left === null){
                        node.left = newNode;
                    }else{
                        this.insertNode(node.left, newNode)
                    }
                }else{
                    if(node.right === null){
                        node.right = newNode;
                    }else{
                        this.insertNode(node.right, newNode)
                    }
                }
            },
            inOrderTraverseNode: function(node, callback){
                if(node !== null){
                    this.inOrderTraverseNode(node.left, callback);
                    callback(node.key);
                    this.inOrderTraverseNode(node.right, callback);
                }
            },
            preOrderTraverseNode: function(node, callback){
                if(node !== null){
                    callback(node.key);
                    this.preOrderTraverseNode(node.left, callback);
                    this.preOrderTraverseNode(node.right, callback);
                }
            },
            postOrderTraverseNode: function(node, callback){
                if(node !== null){
                    this.postOrderTraverseNode(node.left, callback);
                    this.postOrderTraverseNode(node.right, callback);
                    callback(node.key);
                }
            },
            minNode: function(node){
                if(node){
                    while(node && node.left !== null){
                        node = node.left;
                    }
                    return node.key;
                }
                return null;
            },
            maxNode: function(node){
                if(node){
                    while(node && node.right !== null){
                        node = node.right;
                    }
                    return node.key;
                }
                return null;
            },
            searchNode: function(node, key){
                if(node === null)
                return false;
                if(key < node.key){
                    return this.searchNode(node.left, key);
                }else if(key > node.key){
                    return this.searchNode(node.right, key);
                }else{
                    return true;
                }
            },
            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){
                        node = node.right;
                        return node;
                    }else if(node.right === null){
                        node = node.left;
                        return node;
                    }
                    var aux = this.findMinNode(node.right);
                    node.key = aux.key;
                    node.right = this.removeNode(node.right, aux.key);
                    return node;
                }
            },
            findMinNode: function(node){
                if(node){
                    while(node && node.left !== null){
                        node = node.left;
                    }
                    return node.key;
                }
                return null;
            }
        }

相关文章
|
1月前
|
算法
【数据结构】二叉搜索树
【数据结构】二叉搜索树
21 2
|
2月前
|
存储 前端开发 JavaScript
JavaScript 中的 BLOB 数据结构的使用介绍
JavaScript 中的 BLOB 数据结构的使用介绍
60 1
|
3月前
|
JavaScript 前端开发
JavaScript一种新的数据结构类型Map
JavaScript一种新的数据结构类型Map
|
4月前
|
算法 JavaScript 前端开发
JavaScript算法和数据结构:写一个二分查找的函数。
JavaScript算法和数据结构:写一个二分查找的函数。
32 0
|
6月前
|
C++
剑指offer(C++)-JZ36:二叉搜索树与双向链表(数据结构-树)
剑指offer(C++)-JZ36:二叉搜索树与双向链表(数据结构-树)
|
6月前
|
C++
剑指offer(C++)-JZ68:二叉搜索树的最近公共祖先(数据结构-树)
剑指offer(C++)-JZ68:二叉搜索树的最近公共祖先(数据结构-树)
【数据结构】是否同一棵二叉搜索树
【数据结构】是否同一棵二叉搜索树
【C++&数据结构】超详细一文带小白轻松全面理解 [ 二叉搜索树 ]—— [从零实现&逐过程分析&代码演示&简练易懂](23)
【C++&数据结构】超详细一文带小白轻松全面理解 [ 二叉搜索树 ]—— [从零实现&逐过程分析&代码演示&简练易懂](23)
|
4月前
|
JavaScript 前端开发
【JavaScript 关于数据结构】假如你会很快速的处理一些奇怪的数据结构...
【JavaScript 关于数据结构】假如你会很快速的处理一些奇怪的数据结构...
|
4月前
|
存储 JavaScript 前端开发
JavaScript数据结构【进阶】
JavaScript数据结构【进阶】
34 0