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?
recursive
java
public class Solution { ArrayList<Integer> result; public ArrayList<Integer> postorderTraversal(TreeNode root) { result = new ArrayList<Integer>(); postTraversal(root); return result; } public void postTraversal(TreeNode root){ if(root!=null){ postTraversal(root.left); postTraversal(root.right); result.add(root.val); } } }
vector<int> postorderTraversal(TreeNode *root) { vector<int> result; postTraversal(root,result); return result; } void postTraversal(TreeNode *root, vector<int> &result){ if(root!= NULL){ postTraversal(root->left,result); postTraversal(root->right,result); result.push_back(root->val); } }
iterative
java
public ArrayList<Integer> postorderTraversal(TreeNode root) { ArrayList<Integer> result1 = new ArrayList<Integer>(); if(root == null) return result1; ArrayList<TreeNode> path = new ArrayList<TreeNode>(); int index = 0; path.add(root); TreeNode head = root; while(index>=0){ TreeNode topNode = path.get(index); if((topNode.left == null && topNode.right == null)||topNode.left ==head || topNode.right == head ) { result1.add(topNode.val); path.remove(index); index--; head = topNode; }else { if(topNode.right!=null) { path.add(topNode.right); index++; } if(topNode.left!= null){ path.add(topNode.left); index++; } } } return result1; }
refactor
public List<Integer> postorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<>(); if(root==null) return result; Stack<TreeNode> path = new Stack<>(); path.push(root); TreeNode head = root; while(!path.isEmpty()){ TreeNode topNode = path.peek(); if((topNode.right==null && topNode.left==null) || topNode.left==head || topNode.right==head){ result.add(topNode.val); path.pop(); head = topNode; }else { if(topNode.right!=null){ path.push(topNode.right); } if(topNode.left!=null){ path.push(topNode.left); } } } return result; }
c++
vector<int> postorderTraversal(TreeNode *root) { stack<TreeNode *> buffer; vector<int> output; if (root == NULL) return output; buffer.push(root); while (!buffer.empty()) { TreeNode *temp = buffer.top(); if (temp->right == NULL && temp->left == NULL) { output.push_back(temp->val); buffer.pop(); while (!buffer.empty() && (buffer.top()->left == temp || buffer.top()->right == temp) ) { temp = buffer.top(); output.push_back(temp->val); buffer.pop(); } } else { if (temp->right != NULL) buffer.push(temp->right); if (temp->left != NULL) buffer.push(temp->left); } } return output; }