Leetcode-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?

Recursice:

import java.util.ArrayList;
import java.util.List;
public class Solution {
    public void postorder(TreeNode root, List<Integer> list){
    	if( root == null )
			return;
		postorder(root.left,list);
		postorder(root.right, list);
		list.add(root.val);
	}
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
		postorder(root, list);
		return list;
    }
}

Iterative:

思路:

其實我們希望棧中保存的從頂部依次是root->left, root->right, root,當符合上面提到的條件時,就進行出棧操作。有一種巧妙的方法可以做到,先上代碼

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
		if( root == null )
			return list;
		LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
		TreeNode p= root;
		stack.push(p);
		stack.push(p);
		while( !stack.isEmpty() ){
			p = stack.getFirst();
			p = stack.pop();
			if( !stack.isEmpty() && p == stack.getFirst() ){
				if( p.right != null ){
					stack.push(p.right);
					stack.push(p.right);
				}
				if( p.left != null ){
					stack.push(p.left);
					stack.push(p.left);
				}
			}else{
				list.add(p.val);
			}
		}
		return list;
    }
}
對於每個節點,都壓入兩遍,在循環體中,每次彈出一個節點賦給p,如果p仍然等於棧的頭結點,說明p的孩子們還沒有被操作過,應該把它的孩子們加入棧中,否則,訪問p。也就是說,第一次彈出,將p的孩子壓入棧中,第二次彈出,訪問p。

參考鏈接:

http://www.cnblogs.com/rain-lei/p/3705680.html


發佈了107 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章