二叉树的三种迭代遍历

二叉树的三种迭代遍历

二叉树的三种遍历方式分别是前序、后序、中序。其递归方式比较简单,此处用栈模拟递归来描述二叉树的三种遍历方式的迭代版本

1、前序遍历

先到最左边节点,一路上收集左节点到栈中,并保存到结果集。

之后不断出栈,并对出栈结果的右节点进行如上操作

class Solution {
    
    
    public List<Integer> preorderTraversal(TreeNode root) {
    
    
        List<Integer> ans = new ArrayList<>();
        if(root == null) return ans;

        TreeNode cur = root;
        Deque<TreeNode> stack = new LinkedList<>();
        while(!stack.isEmpty() || cur != null) {
    
    
            while(cur != null) {
    
    
                stack.push(cur);
                ans.add(cur.val);
                cur = cur.left;
            }
            cur = stack.pop().right;
        }
        return ans;
    }
}

2、中序遍历

和前序遍历基本一致,所不同的是在中序中要求的结果是:左中右,所以在保存结果集的时候只能是在回来的路上保存

class Solution {
    
    
    public List<Integer> inorderTraversal(TreeNode root) {
    
    
        List<Integer> ans = new ArrayList<>();
        if(root == null) return ans;

        Deque<TreeNode> stack = new LinkedList<>();
        TreeNode cur = root;
        while(!stack.isEmpty() || cur != null) {
    
    
            while(cur != null) {
    
    
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode node = stack.pop();
            ans.add(node.val);
            cur = node.right;
        }
        return ans;
    }
}

3、后序遍历

后序遍历的方式是:左 右 根,此处我们如果反过来就是:根 右 左

我们发现,这其实是一种反方向的前序遍历,只需要将前序遍历的左右调换位置即可得到根右左,最后将得到的结果反转即可

class Solution {
    
    
  public List<Integer> postorderTraversal(TreeNode root) {
    
    
    // 转化为前序遍历反转即可
    List<Integer> ans = new ArrayList<>();
    if(root == null) return ans;

    TreeNode cur = root;
    Deque<TreeNode> stack = new LinkedList<>();
    while(!stack.isEmpty() || cur != null) {
    
    
      while(cur != null) {
    
    
        ans.add(cur.val);
        stack.push(cur);
        cur = cur.right;
      }
      cur = stack.pop().left;
    }
    Collections.reverse(ans);
    return ans;
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_42999705/article/details/114969852