二分查找&树模板——Javascript清晰学习路程

二分查找法

 JavaScript二分法寻找数组元素 - Web前端工程师面试题讲解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1iJ411N7Hw?from=search&seid=12896647752690193119&spm_id_from=333.337.0.0

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

写出二叉树的非递归遍历很难么?这次再带你写出中序遍历的迭代法!|二叉树的非递归遍历 | 二叉树的遍历迭代法_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Zf4y1a77g/?spm_id_from=333.788

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

代码随想录 (programmercarl.com)https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.htmlo(N)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值