微信扫一扫打赏支持

js刷题爬坑---3、day 4

js刷题爬坑---3、day 4

一、总结

一句话总结:

算法题先写伪代码,思路想通了,算法题真的超级好写,比如说字典树

 

1、递归要注意递归终止条件和递归对应的递推表达式,尤其是用递归做树(比如字典树,二叉树)的时候,要特别注意?

递归要注意递归终止条件和递归对应的递推表达式,尤其是用递归做树(比如字典树,二叉树)的时候,要特别注意

 

 

2、特别注意递归的返回值?

递归一般都是要有返回值的,比如创建树的递归操作中,递归的返回值就是创建好的树
//2、根据树的先序遍历的结果 创建二叉树
let arr2=['a','b','d','#','f','#','#','#','c','#','e','#','#'];
function createTree2(arr2){
    //先序遍历根左右,也就是先创建根节点,再递归创建左右节点
    //递归的终止条件:arr2为空
    //递归中的判断:遇到#号,不必加入节点
    //递归的返回值是什么:写递归一定要非常清楚递归的返回值是什么
    let root=null;
    let nodeVal=arr2.shift();
    //递归终止条件判断
    if(nodeVal!==undefined){
        //#号判断
        if(nodeVal!='#'){
            //先创建根节点,再递归创建左右节点
            root=new TreeNode(nodeVal);
            root.left=createTree2(arr2);
            root.right=createTree2(arr2);
        }
    }
    return root;
}

 

 

3、特别注意递归的终止条件?

比如根据树的先序遍历的结果创建二叉树中,递归的终止条件就是 遇到叶子节点
//2、根据树的先序遍历的结果 创建二叉树
let arr2=['a','b','d','#','f','#','#','#','c','#','e','#','#'];
function createTree2(arr2){
    //先序遍历根左右,也就是先创建根节点,再递归创建左右节点
    //递归的终止条件:arr2为空
    //递归中的判断:遇到#号,不必加入节点
    //递归的返回值是什么:写递归一定要非常清楚递归的返回值是什么
    let root=null;
    let nodeVal=arr2.shift();
    //递归终止条件判断
    if(nodeVal!==undefined){
        //#号判断
        if(nodeVal!='#'){
            //先创建根节点,再递归创建左右节点
            root=new TreeNode(nodeVal);
            root.left=createTree2(arr2);
            root.right=createTree2(arr2);
        }
    }
    return root;
}

 

 

4、创建一棵树的常见几种方式?

a、一般创建一棵树可以通过层次遍历序列、
b、深度优先里面的先序遍历序列(单中序和单后序不太好创建树)、
c、直接通过插入节点来生成树(字典树)

 

 

5、二叉树先序、中序、后序、层次 遍历的英文?

preOrder Traversal、inOrder Traversal、postOrder Traversal、levelOrder

 

 

6、队列解决问题的算法模板?

当队列不为空的时候,循环的将队列队首的元素出队,把和出队元素相关的元素加入到队列
while(队列不为空){
    1、将队列队首的元素出队
    2、把和出队元素相关的元素加入到队列
}

 

 

7、在取或者用节点之前,为什么一定要判断节点是否存在?

因为这样可以避免很多错误,无论是在算法题中,还是在日常的开发中操作数据库,都是先判断数据是否存在,然后取数据进行增删改等操作

 

 

8、写一个递归必须要注意的三个点(无论是普通递归,还是递归做树、图这些的操作)?

1、递归的结束条件(比如对树,一般都是到叶子节点,比如对普通题目,一般都是到初始值)
2、递归的递推表达式(对树而言,就是父子节点的关系)
3、递归的返回值(创建树返回创建的子树,遍历树无需返回值)

 

9、写树的递归的注意点?

a、递归的结束条件(比如对树,一般都是到叶子节点,比如对普通题目,一般都是到初始值)
b、递归的递推表达式(对树而言,就是父子节点的关系)
c、递归的返回值(创建树返回创建的子树,遍历树无需返回值)

 

 

10、当递归有返回值的时候的注意点?

a、要么记得把递归return出去,比如return find(root.chilren[char],str.slice(1));
b、要么记得把递归操作的结果保存下来,比如创建树的操作
//字典树的查找操作
function find(root,str){
    //递归的终止条件:当str为空的时候
    //递归的递推表达式:父节点的子节点的过程,字符串的第一个字符被用掉
    //递归的返回值:true或者false
    if(str[0]!==undefined){
        let char=str[0];
        //如果找到当前节点,就往下走,
        // 找不到,直接return false
        if(root.chilren[char]!==undefined){
            return find(root.chilren[char],str.slice(1));
        }else{
            return false;
        }
    }else{
        if(root.count>=1) return true;
        else return false;
    }
}

 

 

11、解算法题的步骤?

1、题目的算法思路:比如树的创建和遍历用的递归 或者队列
2、题目的算法过程:具体实现的过程
3、写出算法的注意点:比如递归的注意点,比如队列的注意点
4、根据前三条写代码就非常非常简单,而且也不容易出错

 

 

12、队列在遍历二叉树的时候,具体的遍历节点操作放在节点加入队列之前,还是节点加入队列之后?

其实是节点加入队列之前,因为叶子节点是没必要加入到队列的,那么如果选择加入队列之后访问,就访问不到叶子节点,所以推荐所有的操作,具体的操作放到元素放到队列之前

 

 

 

 

 

二、内容在总结中

博客对应课程的视频位置:

 

 

 

 
posted @ 2020-05-25 05:16  范仁义  阅读(181)  评论(0编辑  收藏  举报