• 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、队列在遍历二叉树的时候,具体的遍历节点操作放在节点加入队列之前,还是节点加入队列之后?

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

    二、内容在总结中

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

     
  • 相关阅读:
    max_element( )
    dp
    dfs
    dp
    区间dp
    树形dp
    dp-最长回文串
    go 结构体函数
    go 结构体初始化
    Golang数组和切片的区别
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12954279.html
Copyright © 2020-2023  润新知