[LeetCode] Binary Tree Preorder Traversal (non-recursive first order Traversal)
Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes 'values.
For example:
Given binary tree{1,#,2,3},
1 \ 2 / 3
Return[1,2,3].
Note: Recursive solution is trivial, cocould you do it iteratively
Solution:
The forward traversal of a binary tree. A non-recursive method is required. Let's take a look at the solution of recursive methods.
1. Recursive solution.
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector
preorderTraversal(TreeNode* root) { vector
result; preorderHelper(result, root); return result; } void preorderHelper(vector
& result, TreeNode* root){ if(root==NULL){ return; } result.push_back(root->val); preorderHelper(result, root->left); preorderHelper(result, root->right); }};
2. Non-recursive Solution
We can use two data structures to store intermediate states. Use a queue to store left children and stack to store right children. Traverse all left children first.
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector
preorderTraversal(TreeNode* root) { vector
result; queue
l; stack
r; if(root!=NULL){ l.push(root); } while(!l.empty()||!r.empty()){ TreeNode* node = NULL; if(!l.empty()){ node=l.front(); l.pop(); }else{ node=r.top(); r.pop(); } result.push_back(node->val); if(node->left!=NULL){ l.push(node->left); } if(node->right!=NULL){ r.push(node->right); } } return result; }};