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();
};