二分查找法
leetcode69,744,540,278,153,34
function seaching(target){
var start = 0, end = target.length-1, mid;
while(start<=end){
mid = (start+end)>>1;
if(arr[mid]===target){return mid;}
else if(target<arr[mid]){end = mid-1;}
else{start = mid+1;}
}
return -1;
}
树
1.写一个树结构
const tree={
val:'1',
left:{
val:'2',
left:{val:'4',
left:{val:'8',left:null,right:null},
right:null},
right:{val:'3',left:null,right:null}
},
right:{
val:'5',
left:{val:'6',left:null,right:null},
right:{val:'7',left:null,right:null}
}
}
2.会树的3种遍历,递归和迭代方法(都是深度优先搜索)
leetcode144 94 145
递归三部曲
- 递归参数和返回值;
- 确定终止条件;
- 确定单层递归的逻辑。
o(N)
var prTraversal=function(root){
let arr=[];//放结果
const dfs = function (root){//要循环的函数
if(root===null)return ;
//前序
arr.push(root.val);
dfs(root.left);
dfs(root.right);
//中序
dfs(root.left);
arr.push(root.val);
dfs(root.right);
//后序
dfs(root.left);
dfs(root.right);
arr.push(root.val);
}//包闭存储
dfs(root);
return arr;
}
迭代(简单递归可以用栈迭代模拟)
//栈记录遍历过的节点,弹出元素是顺序是结果
//前序,栈先进后出,进栈顺序是中右左
var prTraversal = function(root){
if(!root) return [];//别忘了
let stack = [root];//栈里存放节点,不是值
let res = [];
while(stack.length){
const cur = stack.pop();
res.push(cur.val);
cur.right&&stack.push(cur.right);
cur.left&&stack.push(cur.left);
}
return res;
}
//后序是前序中左右->中右左->左右中(结果数组颠倒reverse)
var poTraversal = function(root){
if(!root) return [];
let stack = [root];
let res = [];
while(stack.length){
const cur = stack.pop();
res.push(cur.val);
cur.left&&stack.push(cur.left);
cur.right&&stack.push(cur.right);
}
return res.reverse();
}
//中序,访问的顺序与处理顺序不同
var inTraversal = function(root){
let stack = [];
let res = [];
let cur = root;
while(stack.length||cur){
if(cur){
stack.push(cur);
cur = cur.left;
}else{
cur = stack.pop();
res.push(cur.val);
cur = cur.right;
}
}
return res;
}
console.log('前',prTraversal(tree));
console.log('后',poTraversal(tree));
console.log('中',inTraversal(tree));
3.广度优先搜索(层序,迭代)
leetcode102 107 199 637 429 515 116 117 104 111
var levelOrder = function(root){
if(!root) return [];
let res = [],que = [root];
while(que.length){
const length = que.length;//不在for中直接用que.length,保证循环时一层length不变
let curLevel = [];
for(let i=0;i<length;i++){
const node = que.shift();
curLevel.push(node.val);
node.left&&que.push(node.left);
node.right&&que.push(node.right);
}
console.log(curLevel);
res.push(curLevel);
}
return res;
}
console.log(levelOrder(tree));