二叉树非递归遍历
1.如果节点不为空,栈不为空
2.节点不为空,一直放左子树(把左面一列全部放进栈中)
一直放左链,直到为空
(根据前序遍历或者中序遍历,在不同的位置加入root的值到res数组,可以想象成root节点进入栈时候是以根节点进入栈的,但是弹栈的时候,是以左子节点的形式弹栈的,所以在哪个阶段加入到答案list数组,就构成了不同形式的遍历,前序还是中序)
3.弹栈,如果有右子树,就加入又子树
根据前序遍历或者中序遍历,在不同的位置加入root的值到res数组
如果是后序遍历,左右中, 就相当于前序遍历是中左右 -> 改成是中右左, 这样反过来就是后序遍历 左右中
后序遍历
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while(root != null || !stack.isEmpty()){
while(root != null){
res.add(root.val);
stack.push(root);
root = root.right;
}
root = stack.pop();
root = root.left;
}
Collections.reverse(res);
return res;
}
}