平衡二叉树算法

152 阅读1分钟

1.平衡二叉树


function isBalanced(root){

  if(root === null)

   return true;

   return Math.abs(tree_height(root.left) - tree_height(root.right)) <= 1 &&  isBalanced(root.left) &&  isBalanced(root.right);

}


function tree_height(root){

       var deep = -Infinity;

        if(root === null)

            return -1;

        deep = Math.max(deep,tree_height(root.left));

        deep = Math.max(deep,tree_height(root.right));

        return deep+1;

}

2.二叉搜索树

(1)进行中序遍历后是一个递增的序列。(采用线索二叉树来进行中序遍历)

function BST_tree(root){
    var prev = root;
    var cur = root;
    var output = [];
    while(cur.length)
    {
        if(cur.left == null)
        {
            output.push(cur.val);
            cur = cur.right;
        }
    
        else
        {
            prev.left  = cur;
            while(prev.right!=null)
            {
                prev = prev.right;
            }
            prev.right = cur;
            var temp = cur;
            cur = cur.left;
            temp.left = null;
        }    
    }
    return output;
}

(2)利用递归进行二叉树搜索

function searchBST(root){
   if(root === null)
   {
       return true;
   }
   return recurive(root,null,null);
}

function recurive(root,upper,lower)
{
   if(root === null)
   return true;
   var val = root.val;
   if(upper!= null && val >= upper)
   return false;
   if(lower!=null && val <= lower)
   return false;
   var ret_l = recurive(root.left,val,lower);
   var ret_r = recurive(root.right,upper,val);
   return ret_l && ret_r;
}

3.双端队列实现

利用双端队列实现时间复杂度为O(1)的队列操作

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。

若队列为空,pop_front 和 max_value 需要返回 -1

var MaxQueue = function () {

    this.queue = [];
    this.temp = [];
};

/**
 * @return {number}
 */
MaxQueue.prototype.max_value = function () {
   if(this.queue.length < 1)
   return -1;
   else
   return this.temp[0];
};

/** 
 * @param {number} value
 * @return {void}
 */
MaxQueue.prototype.push_back = function (value) {
    
    this.queue.push(value);
    while(value > this.temp[this.temp.length - 1]) {
        this.temp.pop();
    }
    this.temp.push(value);

};

/**
 * @return {number}
 */
MaxQueue.prototype.pop_front = function () {
    if(this.queue.length < 1)
    return -1;
    else
    {
        if(this.temp[0] === value)
        this.temp.shift();
    }
   return  this.queue.shift();
};