[LeetCode] 145. Binary Tree Postorder Traversal Java

题目:

Given a binary tree, return the postorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1
    
     2
    /
   3

return [3,2,1].

题意及分析:后序遍历,先遍历左子节点,然后右子节点,最后才遍历该点。这里对于任意一个节点,如果当前点没有子节点或者 已经访问过存在的子节点,那么可以直接访问该点,并输出该点的值;否则访问该点的子节点。如果用一个栈来实现,那么先从根节点起遍历,如果节点无左右子树或者已经访问过那么直接输出节点的值,否则将该点的右子节点和左子节点先后加入栈中,这样就可以保证先输出左子节点后输出右子节点。

代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
       List<Integer> res = new ArrayList<>();
		Stack<TreeNode> stack=new Stack<>();
		stack.push(root);
		TreeNode preNode=null;
		while(!stack.isEmpty()&&root!=null){
			root=stack.peek();  //得到栈顶的点
			//如果当前节点没有子节点 或者 当前节点的左右子树都被访问,那么可以直接输出该点的值并从栈中弹出该点
			if((root.left==null&&root.right==null)||(preNode!=null&&(root.left==preNode||root.right==preNode))){
				root=stack.pop();
				res.add(root.val);
				preNode=root;
			}else{		//同时访问该点的右子节点和左子节点,保证先输出左后输出右
				if(root.right!=null){
					stack.push(root.right);
				}
				if(root.left!=null){
					stack.push(root.left);
				}
			}
		}
		return res; 
    }
}

 方法二:

public ArrayList<Integer> postorderTraversal(TreeNode root) {         //使用非递归实现后序遍历
        ArrayList<Integer> result = new ArrayList<>();

        Stack<TreeNode> stack = new Stack<>();
        TreeNode node =  root;
        while(!stack.isEmpty() || node !=null){
            if(node!=null){  //入栈的时候添加
                stack.push(node);
                result.add(node.val);
                node = node.right;
            }else{
                node=stack.pop();
                node=node.left;
            }
        }
        Collections.reverse(result);
        return result;
    }

  

原文地址:https://www.cnblogs.com/271934Liao/p/7026169.html