130.Binary Tree Postorder Traversal

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].

Note: Recursive solution is trivial, could you do it iteratively?

Subscribe to see which companies asked this question.

分析:

首先用栈维护待放到结果中的节点,用result表示目前找到的结果,用resultNode表示与目前放到结果中的结点。

首先把根结点放到栈中,然后进入循环,循环结束的条件是栈为空。用node表示上一次放到stack中的节点。

进入循环中,首先把node的所有左分支左孩子放到栈里面,然后读到栈顶元素,如果该节点没有右孩子或右孩子已经被放到结果集中,则把栈顶元素弹栈并放到结果中,否则把栈顶的右孩子放到栈中。

/**
	 * 用迭代的方式后续遍历二叉树。
	 * @date 20160515 
	 * @param root
	 * @return
	 */
	public List<Integer> postorderTraversal(TreeNode root) {
		List<Integer> result = new ArrayList<Integer>();//存目前找到的结果
		Set<TreeNode> resultNode = new HashSet<TreeNode>();//存与目前找到的结果对应的结点
		if(root == null){
			return result;
		}
		Stack<TreeNode> stack = new Stack<TreeNode>();
		/*先把根结放进去*/
		TreeNode node = root;//node表示要放到stack中的结点。
		stack.add(node);
		/*进入循环,循环结束的条件是栈为空*/
		while(!stack.isEmpty()){
			while(node.left != null){
				node = node.left;
				stack.add(node);
			}
			TreeNode top = stack.peek();//读到栈顶元素
			/*如果栈顶元素没有右孩子或者右孩子已经找到,则可以把栈顶元素取出并放到结果集中*/
			if(top.right == null || resultNode.contains(top.right)){
				TreeNode popnode = stack.pop();
				result.add(popnode.val);
				resultNode.add(popnode);
			}else {//如果栈顶有右孩子且该右孩子尚未找到
					node = top.right;
					stack.add(node);
			}
			
		}
		return result;
		
    }


你可能感兴趣的:(130.Binary Tree Postorder Traversal)