前端算法篇:二叉树前中后序遍历的统一写法

119 阅读1分钟

前言

作为前端,对于算法的知识应该有一定的了解。

理解本文,需要对二叉树及其算法有一些基本的了解,本文主要讲解二叉树的前中后序遍历的统一写法。

二叉树

本文讲解以下图二叉树为准。

二叉树.PNG

  • 前序遍历(中 左 右):1 2 4 5 3 6 7
  • 中序遍历(左 中 右):4 2 5 1 6 3 7
  • 后序遍历(左 右 中):4 5 2 6 7 3 1

统一写法

var postorderTraversal = function(root) {
  let stack = []
  let preOrderAns = [], inOrderAns = [], postOrderAns = []
  let cur = root
  while(stack.length || cur != null) {
    while(cur) {
      preOrderAns.push(cur.val)
      stack.push([cur, 0])
      cur = cur.left
    }
    const [node, flag] = stack.pop()
    if(!flag) {
      inOrderAns.push(node.val)
      stack.push([node, 1])
      cur = node.right
    } else {
      postOrderAns.push(node.val)
    }
  }
  console.log(preOrderAns)
  console.log(inOrderAns)
  return postOrderAns
};

我们来看一下入栈,出栈顺序:

  • 1 入栈 flag 0
  • 2 入栈 flag 0
  • 4 入栈 flag 0
  • 4 出栈 flag 0
  • 4 入栈 flag 1
  • 4 出栈 flag 1
  • 2 出栈 flag 0
  • 2 入栈 flag 1
  • 5 入栈 flag 0
  • 5 出栈 flag 0
  • 5 入栈 flag 1
  • 5 出栈 flag 1
  • 2 出栈 flag 1
  • 1 出栈 flag 0
  • 1 入栈 flag 1
  • 3 入栈 flag 0
  • 6 入栈 flag 0
  • 6 出栈 flag 0
  • 6 入栈 flag 1
  • 6 出栈 flag 1
  • 3 出栈 flag 0
  • 3 入栈 flag 1
  • 7 入栈 flag 0
  • 7 出栈 flag 0
  • 7 入栈 flag 1
  • 7 出栈 flag 1
  • 3 出栈 flag 1
  • 1 出栈 flag 1

Tips

前序遍历结果:将上述 入栈 flag 为 0 找出,1 2 4 5 3 6 7

中序遍历结果:将上述 出栈 flag 为 0 找出,4 2 5 1 6 3 7

后序遍历结果:将上述 出栈 flag 为 1 找出,4 5 2 6 7 3 1