post Order traversal

public class Solution{
	class TreeNode{
		int val;
		TreeNode left, right;
		public TreeNode(int val){
			this.val = val;
			this.left = null;
			this.right = null;
		}
	}

//https://blog.csdn.net/zhangxiangDavaid/article/details/37115355 

	/*
		father->left son->right son

	*/
	//recursion
	public List<Integer> postOrderTraversal(TreeNode root){
		List<Integer> res = new ArrayList<>();

		if (root == null) {
			return 
		}

		res.addAll(postOrderTraversal(root.left));
		res.addAll(postOrderTraversal(root.right));
		res.add(root.val);
		return res;
	}
	//non-recursion
	/*
		我们使用prev变量跟踪上一次访问的节点。假设栈顶元素是curr。当prev是curr的父节点时,我们正在向下遍历树。\
		此时,优先遍历curr的左孩子(将左孩子压入栈)。如果没有左孩子,再看右孩子。如果左右孩子都不存在(curr是叶节点),
		就输出curr的值并弹出栈顶元素。如果prev是curr的左孩子,我们正在从左子树向上遍历。我们看一下curr的右孩子。如果可以,
		就从右孩子向下遍历(将右孩子压入栈),否则打印curr的值并弹出栈顶元素。如果prev是curr的右孩子,
		我们正在从右子树向上遍历。打印curr的值并弹出栈顶元素。
	*/
	public List<Integer> postOrderTraversal(TreeNode root){
		List<Integer> res = new ArrayList<>();
		Stack<Integer> stack = new Stack<>();
		TreeNode pre = null;
		TreeNode cur = root;
		if (root == null) {
			return res;
		}
		stack.push(root);

		while(!stack.isEmpty()){
			cur =stack.peek();
			//traversal down
			if (pre == null || pre.left == cur || pre.right == cur) {
				if (cur.left != null) {
					stack.push(cur.left);
				}

				else if (cur.right != null) {
					stack.push(cur.right);
				}
			}

			//traversal up
			else if (cur.left == pre) {
				if (cur.right != null) {
					stack.push(cur.right);
				}
			}else{
				res.add(cur.val);
				stack.pop();
			}

			pre = cur;
		}

	}
}

Last updated