后序遍历思路与中序遍历相同。左边元素依次入栈,当左子节点为空时,对右子节点进行判断,如果右子节点为空或者已经pop过,则继续pop,否则对右子节点按照相同的方式入栈
package 二叉树的后序遍历;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import 二叉树的后序遍历.TreeNode;
public class Solution {
public static void main(String[] args) {
// TODO 自动生成的方法存根
TreeNode root = new TreeNode(1);
root.right = new TreeNode(2);
root.right.left = new TreeNode(3);
System.out.println(postorderTraversal(root));
}
public static List<Integer> postorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<Integer>();
}
List<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> s = new Stack<TreeNode>();
TreeNode currentNode = null;
while(!s.isEmpty() || root != null) {
while(root != null) {
s.push(root);
root = root.left;
}
if(s.peek().right == null) {
currentNode = s.pop(); //记录上一次出栈的节点
list.add(currentNode.val);
}
else {
if(s.peek().right == currentNode) {
currentNode = s.pop(); //记录上一次出栈的节点
list.add(currentNode.val);
}
else
root = s.peek().right;
}
}
return list;
}
}