1.先序遍历(中左右)

  1. 先访问根节点
  2. 对根节点的左子树进行先序遍历
  3. 对根节点的右子树进行先序遍历

    1.递归法:

    1. function preOrder(root) {
    2. if (!root) return
    3. console.log(root.val);
    4. preOrder(root.left)
    5. preOrder(root.right)
    6. }

    2.栈方法模拟递归

    1. function preOrder(root) {
    2. let stack = [root]
    3. // 先序:中 左 右
    4. while(stack.length) {
    5. let node = stack.pop()
    6. console.log(node.val);
    7. // 先 push 进 right 是为了先 pop 出left
    8. // 操作的是 pop 出来的顺序
    9. node.right && stack.push(node.right)
    10. node.left && stack.push(node.left)
    11. }
    12. }

    2.中序遍历(左中右)

  4. 先访问左子节点,对左子节点进行中序遍历

  5. 再访问根节点
  6. 再访问右子节点,对右子节点进行中序遍历

    1.递归法

    1. const inorder = root => {
    2. if (!root) return
    3. inorder(root.left)
    4. console.log(root.val);
    5. inorder(root.right)
    6. }

    2.迭代法,配合 stack控制任务队列

    1. var inorderTraversal = function(root) {
    2. let list = [] // 存放中序遍历顺序
    3. let stack = [] // 栈控制任务堆栈,模拟递归
    4. let cur = root // 当前任务指向 root
    5. while(cur || stack.length) { // 如果存在当前任务,或者任务堆栈种存在任务
    6. if (cur) {
    7. // 如果存在当前任务,则往任务堆栈中 push 任务
    8. stack.push(cur)
    9. cur = cur.left // 通过 while 循环,将 root 的所有左子节点都先 push 到stack 中
    10. } else {
    11. cur = stack.pop() // 如果当前指向节点不存在了,说明左子节点到底了,则从任务堆栈中取出最新push进去的,也就是最底层的 left 节点
    12. list.push(cur.val)
    13. cur = cur.right // 关键点:left 都循环完了之后,将当前节点改为 最底层的 left节点的 right,继续循环
    14. }
    15. }
    16. return list
    17. };

    3.后序遍历(左右根)

  7. 先访问左子节点,进行后序遍历

  8. 再访问右子节点,对右子节点进行后序遍历
  9. 再访问根节点

1.递归版

  1. function nextOrder(node, arr) {
  2. if (!node) return
  3. nextOrder(node.left, arr)
  4. nextOrder(node.right, arr)
  5. arr.push(node.val)
  6. }

2.堆栈控制法

var postorderTraversal = function(root) {
  let stack = [root] // 任务堆栈,push的顺序与执行的顺序正好相反
  // 只用一个 stack 会变成广度优先遍历
  // 这里再用一个 stack 控制 左右中的任务堆栈
  let outputstack = []
  while(stack.length) {
    let node = stack.pop() // 操作的节点
    outputstack.push(node) // 先往 outputstack push 中 node
    node.left && stack.push(node.left) // 再往 stack 中 push left node
    node.right && stack.push(node.right) // 再往 stack 中 push right node
    // 这样 stack 下一轮 pop 出来的时候就是 right left,再进入  outputstack 就是 right left
  }
  while(outputstack.length) {
    let node = outputstack.pop()
    console.log(node.val);
  }
};