后序遍历:
对于节点cur可以分情况讨论
1. cur如果是叶子节点,直接输出
2. cur如果有孩子,且孩子没有被访问过,则按照右孩子,左孩子的顺序依次入栈
3. cur如果有孩子,而且孩子都已经访问过,则访问p节点
import java.util.*;
public class Solution {
public ArrayList<Integer> postorderTraversal(TreeNode root) {
Stack<TreeNode> sta = new Stack<TreeNode>();
TreeNode cur = root;
/* 用来记录最新出栈的节点,
* 如果当前节点的右儿子与flag相同,说明当前节点右子树已完成遍历
*/
TreeNode flag = null;
ArrayList<Integer> ret = new ArrayList<Integer>();
while (cur != null) {
sta.push(cur);
cur = cur.left;
}
while (!sta.isEmpty()) {
cur = sta.pop();
if (cur.right == null || cur.right == flag) {
ret.add(cur.val);
flag = cur;
}
else {
sta.push(cur);
cur = cur.right;
while(cur != null) {
sta.push(cur);
cur = cur.left;
}
}
}
return ret;
}
}
新手上路,参照了两位大锅的客,自己理解了下,欢迎交流。
https://www.cnblogs.com/rain-lei/p/3705680.html
https://blog.csdn.net/WANG_Chaunwang/article/details/79896631