06 极客大学-算法训练营-覃超-第六课.pdf

二叉树的遍历

4、树、二叉树、二叉搜索树的实现和特性 - 图1

总结

递归

  • 递归式 ==> 每一次重复的内容是什么
  • 递归边界 ==> 什么时候停下来

迭代

  • 层序遍历:用辅助队列
  • 深度遍历:用辅助栈

二叉树遍历

掘金 https://juejin.cn/book/6844733800300150797/section/6844733800363065352

前序遍历

根 —> 左 —> 右

  • 递归:

    1. var preorderTraversal = function(root) {
    2. let result = []
    3. // 定义递归函数
    4. const preorderfun = (root)=>{
    5. if(!root) return // 递归中止条件
    6. // 前序遍历顺序:根-左-右
    7. result.push(root.val)
    8. preorderfun(root.left)
    9. preorderfun(root.right)
    10. }
    11. preorderfun(root)
    12. return result;
    13. }
  • 迭代:辅助栈

    1. var preorderTraversal = function(root) {
    2. let result = [];
    3. if(!root) return result;
    4. let stack = []; // 声明一个辅助栈,出栈的时候将左右节点入栈
    5. stack.push(root);
    6. while(stack.length){
    7. let cur = stack.pop();
    8. result.push(cur.val);
    9. // 先将右节点入栈,方便后弹出
    10. if(cur.rigth){
    11. stack.push(cur.right);
    12. }
    13. if(cur.left){
    14. stack.push(cur.left);
    15. }
    16. }
    17. return result;
    18. }

    中序遍历

    左 —> 根 —> 右

  • 递归:

    1. var inorderTraversal = function(root) {
    2. let result = []
    3. const inorderFun = (root)=>{
    4. if(!root) return;
    5. inorderFun(root.left);
    6. result.push(root.val);
    7. inorderFun(root.right);
    8. }
    9. return result;
    10. }
  • 迭代:辅助栈 当前root作为游标 ```javascript var inorderTraversal = function(root) {

    1. let result = []

    if(!root) return;

    1. let stack = [];
    2. let cur = root;
    3. while(cur || stack.length){
    4. while(cur){
    5. stack.push(cur.left);
    6. cur = cur.left
    7. }
    8. cur = stack.pop();
    9. result.push(cur.val);
    10. cur = cur.right;

    }

    1. return result;

    }

  1. <a name="u5lpG"></a>
  2. #### [后序遍历](https://leetcode-cn.com/problems/binary-tree-postorder-traversal/comments/)
  3. > 左 --> 右 --> 根
  4. - **递归:**
  5. ```javascript
  6. var postorderTraversal = function(root) {
  7. let result = [];
  8. const postorderFun = (root)=>{
  9. if(!root) return;
  10. postorderFun(root.left);
  11. postorderFun(root.right);
  12. result.push(root.val);
  13. }
  14. return result;
  15. }
  • 迭代:辅助栈

    1. var postorderTraversal = function(root) {
    2. // 定义结果数组
    3. let result = [];
    4. // 处理边界条件
    5. if(!root) return;
    6. // 初始化栈结构
    7. let stack = [];
    8. // 首先将根结点入栈
    9. stack.push(root);
    10. // 若栈不为空,则重复出栈、入栈操作
    11. while(stack.length){
    12. // 将栈顶结点记为当前结点
    13. let cur = stack.pop();
    14. // 当前结点就是当前子树的根结点,把这个结点放在结果数组的头部
    15. result.unshift(cur.val);
    16. // 若当前子树根结点有左孩子,则将左孩子入栈
    17. if(cur.left){
    18. stack.push(cur.left)
    19. }
    20. // 若当前子树根结点有右孩子,则将右孩子入栈
    21. if(cur.right){
    22. stack.push(cur.right)
    23. }
    24. }
    25. // 返回结果数组
    26. return result;
    27. }

    参考链接

  • 树的遍历 Demo

    实战题目 / 课后作业

  • 二叉树的中序遍历(亚马逊、微软、字节跳动在半年内面试中考过)

  • 二叉树的前序遍历(谷歌、微软、字节跳动在半年内面试中考过)
  • N 叉树的后序遍历(亚马逊在半年内面试中考过)
  • N 叉树的前序遍历(亚马逊在半年内面试中考过)
  • N 叉树的层序遍历