递归三要素

  1. 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
  2. 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
  3. 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

前序遍历

1.前序遍历是中左右的循序(tips:记住中节点的位置,前序遍历就是中在前)
前中后三个代码差不多,这里放前序做参考。
要点:JS节点写法,函数写法,闭包存储,核心代码模式

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val, left, right) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.left = (left===undefined ? null : left)
  6. * this.right = (right===undefined ? null : right)
  7. * }
  8. */
  9. /**
  10. * @param {TreeNode} root
  11. * @return {number[]}
  12. */
  13. var preorderTraversal = function(root) {
  14. let res=[];
  15. const dfs=function(root){
  16. if(root===null)return ;
  17. //先序遍历所以从父节点开始
  18. res.push(root.val);
  19. //递归左子树
  20. dfs(root.left);
  21. //递归右子树
  22. dfs(root.right);
  23. }
  24. //只使用一个参数 使用闭包进行存储结果
  25. dfs(root);
  26. return res;
  27. };