平衡二叉树JS代码实现

var Tree = function() {    var Node = function(value) {        this.value = value;        this.left = null;        this.right = null;    }    var root = null;    //根节点      /*    插入节点:    1、树为空    2、树不为空 -> 比较(小于 -> 往左走;大于 -> 往右走)    */     this.insert = function(value) {        var newNode = new Node(value);        if(root == null) { //空树                      root = newNode;        }else{//树非空                       insertNode(root, newNode);        }    };    //自平衡树插入新节点    var insertNode = function(node,newNode) {        if(node == null) {            node = newNode;        //向左走(向左子树拆入新节点,且节点的值小于其左子节点时,应该进行LL旋转。否则,进行LR旋转)        }else if(newNode.value < node.value) {            node.left = insertNode(node.left, newNode);            if(node.left == null) {                node.left = newNode;                if(heightNode(node.left) - heightNode(node.right) > 1) {                    if(newNode.value < node.left.value) {                        node = rotationLL(node);                    }else{                        node = rotationLR(node);                    }                }            }else if(node.left !== null){                if(heightNode(node.left) - heightNode(node.right) > 1) {                    if(newNode.value < node.left.value) {                        node = rotationLL(node);                    }else{                        node = rotationLR(node);                    }                }            }        //向右走(向右子树拆入新节点,且节点的值大于其右子节点时,应该进行RR旋转。否则,进行RL旋转)        }else if(newNode.value > node.value) {            node.right = insertNode(node.right, newNode);            if(node.right == null) {                node.right = newNode;                if(heightNode(node.right) - heightNode(node.left) > 1) {                    if(newNode.value > node.right.value) {                        node = rotationRR(node);                    }else{                        node = rotationRL(node);                    }                }            }else if(node.right !== null) {                if(heightNode(node.right) - heightNode(node.left) > 1) {                    if(newNode.value > node.right.value) {                        node = rotationRR(node);                    }else{                        node = rotationRL(node);                    }                }            }        }        return node;    };    var heightNode = function(node) {        if(node === null) {            return -1;        }else{            return Math.max(heightNode(node.left), heightNode(node.right)) + 1;        }    };    //RR向左的单旋转    var rotationRR = function(node) {        var tmp = node.right;        node.right = tmp.left;        tmp.left = node;        return tmp;    };    //LL向右的单旋转    var rotationLL = function(node) {        var tmp = node.left;        node.left = tmp.right;        tmp.right = node;        return tmp;    };    //LR向右的双旋转    var rotationLR = function(node) {        node.left = rotationRR(node.left);        return rotationLL(node);    }    //RL向左的双旋转    var rotationRL = function(node) {        node.right = rotationLL(node.right);        return rotationRR(node);    };    //遍历节点    this.traverse = function(callback) {        traverse(root, callback);    };    var traverse = function(node, callback) {        if(node == null) return;        //(后续遍历)左右中;(中序遍历)左中右;(前序遍历)中左右        traverse(node.left, callback);        traverse(node.right, callback);        callback(node.value);    };        //显示树    this.getRoot = function() {        return root;    };}

测试代码:

var t = new Tree;var print = function(value) {    console.log('value -',value)   };t.insert(11);t.insert(8);t.insert(4);t.insert(9);t.traverse(print);