思路
其实二叉树的后序遍历,相当于,右左根的反向输出,可以利用栈来进行逆向输出,另个栈辅助遍历过程
- 入栈,入输出栈
- 遍历右子树
2.1 非空: (1)
2.2 空值: (4) - 遍历左子树
- 逆向输出
整体操作流程
整体动图
详情
遍历右子树,入输出和辅助栈
右子树为空,辅助栈出栈,遍历左子树
遍历完毕后输出
相关代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
result.addAll(noRecursive(root));
return result;
}
// 左右根
public List<Integer> noRecursive(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
Stack<TreeNode> resultStack = new Stack<TreeNode>();
while(root!=null||!stack.empty()){
// 遍历右子树
while(root!=null){
// 根
stack.push(root);
resultStack.push(root);
root = root.right;
}
// 设置为左子树的右子树
if(!stack.isEmpty()){
root = stack.pop();
root = root.left;
}
}
while(!resultStack.isEmpty()){
TreeNode node = resultStack.pop();
result.add(node.val);
}
return result;
}
// 递归
public List<Integer> recursive(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
if(root==null){
return result;
}
result.addAll(recursive(root.left));
result.addAll(recursive(root.right));
result.add(root.val);
return result;
}
}