[路飞]_小白学算法之二叉树前序中序后序遍历~

295 阅读2分钟

二叉树

前序or先序二叉树遍历

根据图示字母表示节点,数字表示遍历输出的顺序

二叉树前序遍历.png

function beforeTraversal(root){
    let result = []
    let stack = []
    while(root || stack.length>0){
        while(root){
            result.push(root.val)
            stack.push(root)
            root = root.left
        }
        root = stack.pop()
        root = root.right
    }
    return result
}

分析代码运行时入栈出栈的顺序是:

  • A,B,D,E 入(result)栈,入(stack)栈,
  • E出(stack)栈
  • D出(stack)栈
  • F入(result)栈,入(stack)栈,
  • F出(stack)栈
  • A出(stack)栈
  • C入(result)栈,入(stack)栈
  • H入(result)栈,入(stack)栈
  • G入(result)栈,入(stack)栈
  • G出(stack)栈
  • H出(stack)栈
  • C出(stack)栈
  • S入(result)栈,入(stack)栈
  • S出(stack)栈 入(result)栈即是最后输出的顺序 : A B D E F C H G S

二叉树的中序遍历

根据图示字母表示节点,数字表示遍历输出的顺序 二叉树中序遍历.png

function inorderTraversal(root){
    if(!root)return [];
    let result = []
    let stack = []
    while(root || stack.length ){
        while(root){
            stack.push(root)
            root = root.left
        }
        root = stack.pop()
        result.push(root.val)
        root = root.right
    }
    return res
}

分析代码运行时入栈出栈的顺序是:

  • A 入(stack)栈
  • B 入(stack)栈
  • D 入(stack)栈
  • E 入(stack)栈
  • E 出(stack)栈,E 入(result)栈
  • D 出(stack)栈,D 入(result)栈
  • F 入(stack)栈,F 出(stack)栈,F 入(result)栈
  • B 出(stack)栈,B 入(result)栈
  • A 出(stack)栈,A 入(result)栈
  • C 入(stack)栈
  • H 入(stack)栈,H 出(stack)栈, H 入(result)栈
  • G 入(stack)栈,G 出(stack)栈, G 入(result)栈
  • C 出(stack)栈,C 入(result)栈
  • S 入(stack)栈,S 出(stack), S 入(result)栈 最后输出结果是:E D F B A H G C S

二叉树的后序遍历

根据图示字母表示节点,数字表示遍历输出的顺序

二叉树后序遍历.png

function postorderTraversal(root) {
      let result =[];
      let stack = [];
      while (root || stack.length){
        while(root){
          stack.push(root);
          result.unshift(root.val); //这里unshift 入栈入的是最前面
          root = root.right;
        }
        root = stack.pop();
        root = root.left;
      }
      return res;
  };
  

分析代码运行时入栈出栈的顺序是:

  • A 入(stack)栈, A入(result)栈
  • C 入(stack)栈, C入(result)栈 此时 result : [C,A]
  • S 入(stack)栈, S入(result)栈 result: [S,C,A]
  • S 出(stack)栈
  • C 出(stack)栈
  • H 入(stack)栈,H入(result)栈 result:[H,S,C,A]
  • G 入(stack)栈, G入(result)栈 result:[G,H,S,C,A]
  • G 出(stack)栈
  • H 出(stack)栈
  • A 出(stack)栈
  • B 入(stack)栈, B入(result)栈 result:[B,G,H,S,C,A]
  • B 出(stack)栈
  • D 入(stack)栈, D入(result)栈 result:[D,B,G,H,S,C,A]
  • F 入(stack)栈, F入(result)栈 result:[F,D,B,G,H,S,C,A]
  • F 出(stack)栈
  • D 出(stack)栈
  • E 入(stack)栈, E入(result)栈 result:[E,F,D,B,G,H,A,C,A]
  • E 出(stack)栈 最后输出结果是:[E,F,D,B,G,H,A,C,A] 后序遍历从入栈出栈顺序可以看出来是从树的右边开始遍历并利用了js 数组的方法unshift进行越后入栈的元素排在最前 从而实现了后序遍历