背景
面试时考了这道题,之前一直都会递归遍历,非递归遍历倒是从来没有实际理解过它的具体过程,包括使用什么数据结构,具体的过程是怎样的?满脑子都是二叉树的层序遍历,
但是这里后序遍历和层序遍历还不太一样。
在仔细梳理并讲出自己的思路的时候,还是觉得并非易事。那就来分析分析。
什么是二叉树的后序遍历?
答: 二叉树有多种遍历方式,前序遍历,中序遍历,后序遍历,层序遍历等。层序遍历是一层一层去遍历,比较好理解。前后中也比较好理解, 中节点在前面,就是前序遍历,即中左右;
那后序遍历就是左右中,即先遍历左子树,再遍历右子树,最后是中间根节点,即左右中。
比如上述二叉树,后序遍历结束后, 输出节点顺序如下: 0 null 1 3 5 4 2
代码实现
知道了输出是什么样子,那如何去遍历。这边有两种方式,一种是递归的方式去遍历,另一个是借助栈这个数据结构去遍历。
递归
代码如下
* Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();inOrder(root, res);return res;}public void inOrder(TreeNode root, List<Integer> res) {if (root == null) {return;}inOrder(root.left, res); // 左inOrder(root.right, res); // 右子树res.add(root.val); // 中间节点}
}```
思路是这样的,后序遍历按照访问**左子树——右子树——根节点**的方式遍历这棵树,而在访问左子树或者右子树的时候,也是按照同样的方式后序遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,可直接用递归函数来模拟这一过程。
####非递归的方式