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、队列在遍历二叉树的时候,具体的遍历节点操作放在节点加入队列之前,还是节点加入队列之后?
其实是节点加入队列之前,因为叶子节点是没必要加入到队列的,那么如果选择加入队列之后访问,就访问不到叶子节点,所以推荐所有的操作,具体的操作放到元素放到队列之前
二、内容在总结中
博客对应课程的视频位置: