Tree traversal is quite standard problems. For each of the traversals, both recursive and Iterative methods are described.
Binary Tree Preorder Traversal
Problem Statement (link):
Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree
For example:
Given binary tree
{1,#,2,3}
,1 \ 2 / 3
return
Note: Recursive solution is trivial, could you do it iteratively?
Analysis:[1,2,3]
.Note: Recursive solution is trivial, could you do it iteratively?
Recursive method is trivial as implemented in Sol 1.
In iterative method, a stack is used to store nodes temporarily. In each loop, the current top node in stack is popped and push_back in output vector, then we push its right child and left child in stack if not NULL. The push order is reversed compare to pre-order traversal as stack has the first-in-last-out property. This process continues until the stack is empty.
Code:
Sol 1 - Recursive:
vector<int> preorderTraversal(TreeNode *root) { vector<int> out; recur(root, out); return out; } void recur(TreeNode *node, vector<int>& out) { if (node==NULL) return; out.push_back(node->val); recur(node->left, out); recur(node->right, out); }
Sol 2 - Iterative:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode *root) { stack<TreeNode*> nodeS; vector<int> valV; if (root == NULL) return valV; nodeS.push(root); while(!nodeS.empty()) { TreeNode *node = nodeS.top(); nodeS.pop(); valV.push_back(node->val); // Note the push order is reversed as the push order is exact reversed of pop order if (node->right != NULL) { nodeS.push(node->right); } if (node->left != NULL) { nodeS.push(node->left); } } return valV; } };
Binary Tree Inorder Traversal
Problem Statement (link):
Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree
For example:
Given binary tree
{1,#,2,3}
,1 \ 2 / 3
return
Note: Recursive solution is trivial, could you do it iteratively?
Analysis:[1,3,2]
.Note: Recursive solution is trivial, could you do it iteratively?
A good analysis article about in-order traversal is here.
Recursive method is trivial as implemented in Sol 1.
In the iterative method, a stack is used to store nodes temporarily. We store nodes if it's not NULL, and traverse to its left child; we pop the nodes and store in output vector if current node is NULL, and traverse to its right child. As in Sol 2.
Code:
Sol 1 - Recursive:
vector<int> inorderTraversal(TreeNode *root) { vector<int> valV; inOrder(root, valV); return valV; } void inOrder(TreeNode *node, vector<int> &valV) { if (node==NULL) return; inOrder(node->left, valV); valV.push_back(node->val); inOrder(node->right, valV); }
Sol 2 - Iterative:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ using namespace std; class Solution { public: vector<int> inorderTraversal(TreeNode *root) { vector<int> output; if (root==NULL) return output; stack<TreeNode*> nodeS; TreeNode* node = root; while (node!=NULL || !nodeS.empty()) { if(node!=NULL) { nodeS.push(node); node = node->left; } else { node = nodeS.top(); nodeS.pop(); output.push_back(node->val); node = node->right; } } } };
Binary Tree Postorder Traversal
Problem Statement (link):
Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree
For example:
Given binary tree
{1,#,2,3}
,1 \ 2 / 3
return
Note: Recursive solution is trivial, could you do it iteratively?
Analysis:[3,2,1]
.Note: Recursive solution is trivial, could you do it iteratively?
A very good article about the post-order traversal is here.
The recursive solution is trivial as implemented in Sol 1.
In the iterative method, two stacks are used - one stack method exists but a bit complicated. When traversing the tree from left child to right child, we push nodes into a nodeStack, then pop each node into outputStack. See Sol 2 below.
Code:
Sol 1: Recursive
vector<int> postorderTraversal(TreeNode *root) { vector<int> out; recur(root, out); return out; } void recur(TreeNode *node, vector<int>& out) { if(node==NULL) return; recur(node->left, out); recur(node->right, out); out.push_back(node->val); }
Sol 2: Iterative
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> postorderTraversal(TreeNode *root) { vector<int> output; if (root==NULL) return output; // use two stacks stack<TreeNode *> nodeStack; stack<TreeNode *> outputStack; TreeNode* node = root; nodeStack.push(node); while(!nodeStack.empty()) { node = nodeStack.top(); outputStack.push(node); nodeStack.pop(); if (node->left != NULL) nodeStack.push(node->left); if (node->right != NULL) nodeStack.push(node->right); } while(!outputStack.empty()) { node = outputStack.top(); output.push_back(node->val); outputStack.pop(); } } };
No comments:
Post a Comment