二叉树的前序、后序遍历(迭代方式实现)

221 阅读3分钟

力扣链接如下:

基础介绍:

  1. 二叉树前序遍历(Pre - order Traversal)

    • 定义与遍历顺序

      • 前序遍历的顺序是 “根 - 左 - 右”。也就是说,先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。
      • 例如,对于如下简单的二叉树:
     1
   /   \
  2     3
 / \   / \
4   5 6   7
  • 其前序遍历的顺序是:1、2、4、5、3、6、7。首先访问根节点 1,然后按照前序遍历的规则访问根节点 1 的左子树(2 是左子树的根节点,先访问 2,接着访问 2 的左子树 4,再访问 2 的右子树 5),最后访问根节点 1 的右子树(3 是右子树的根节点,先访问 3,接着访问 3 的左子树 6,再访问 3 的右子树 7)。

2. 二叉树后序遍历(Post - order Traversal)

  1. 定义与遍历顺序

    • 对于前面提到的相同二叉树:
    • 后序遍历的顺序是 “左 - 右 - 根”。即先递归地遍历左子树,然后递归地遍历右子树,最后访问根节点。
     1
   /   \
  2     3
 / \   / \
4   5 6   7
  • 其后序遍历的顺序是:4、5、2、6、7、3、1。先访问根节点 1 的左子树(从最底层的左子树节点开始,4 是 2 的左子树节点,先访问 4,接着访问 2 的右子树 5,然后访问左子树的根节点 2),然后访问根节点 1 的右子树(从最底层开始,6 是 3 的左子树节点,先访问 6,接着访问 3 的右子树 7,然后访问右子树的根节点 3),最后访问根节点 1。

解题思路

1.前序遍历:

创造两个数组:

一个用于记录前序遍历的数组

另一个用于模仿栈

首先将root节点入栈

使用while循环实现迭代,判断的条件是栈不为空

用node实现更新,同时node正是中间节点。在实现node遍历中间节点的同时将node的值存入arr中

利用栈的先进后出的特性先存入右节点再存入左节点,在出栈的时候即能得到左节点在右节点的前面。

var preorderTraversal = function(root) {
    let stack=[]
    let arr=[]
    stack.push(root)
    while(stack.length){
        let node=stack.pop()
        if(node!=null){
            arr.push(node.val)
        }
        else{
            continue
        }
        stack.push(node.right)
        stack.push(node.left)
    }
    return arr
};

2.后序遍历:

其实在解本题前需熟悉二叉树的前序遍历的迭代方式

因为前序遍历的方式是:中 左 右

而后序遍历的方式是: 左 右 中

首先将前序遍历顺序变成:中 右 左,得到整个数组后,使用双指针将整个数组翻转后得到遍历的顺序为:左 右 中

var postorderTraversal = function(root) {
    let arr=[]
    let stack=[]
    stack.push(root)
    while(stack.length!=0){
        let node=stack.pop()
        if(node!==null){
            arr.push(node.val)
        }
        else{
            continue
        }
        stack.push(node.left)
        stack.push(node.right)
        
    }
    let left=0
    let right=arr.length-1
    while(left<right){
        let x=arr[left]
        arr[left]=arr[right]
        arr[right]=x
        left++
        right--
    }
    return arr
};