Tree Traversal – preorder
recursive
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
vector<int> rs;
visit(rs, root);
return rs;
}
void visit(vector<int> &rs, TreeNode *root)
{
if (root == NULL) return;
rs.push_back(root->val);
visit(rs, root->left);
visit(rs, root->right);
}
};
iterative
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
vector<int> rs;
if (!root) return rs;
stack<TreeNode*> st;
st.push(root);
while(!st.empty()) {
TreeNode *node = st.top();
st.pop();
rs.push_back(node->val);
if (node->right) st.push(node->right);
if (node->left) st.push(node->left);
}
return rs;
}
};
Tree Traversal – inorder
iterative
thoughts:
- Create an empty stack S.
- Initialize current node as root
- Push the current node to S and set current = current->left until current is NULL
If current is NULL and stack is not empty then
a) Pop the top item from stack.
b) Print the popped item, set current = popped_item->right
c) Go to step 3.If current is NULL and stack is empty then we are done.
class Solution {
public:
vector<int> inorderTraversal(TreeNode *root) {
/*
* 处理完左子树,处理根节点,然后处理右子树
*/
vector<int> rs;
if (!root) return rs;
stack<TreeNode *> st;
st.push(root);
TreeNode *p = root->left; //当前要处理的节点
while (!st.empty() || p != NULL) {
if (p != NULL) {
st.push(p);
p = p->left;
} else {
TreeNode *top = st.top();
st.pop();
rs.push_back(top->val);
p = top->right;
}
}
return rs;
}
};
Tree Traversal – postorder
iterative
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> rs;
if (!root) return rs;
stack<TreeNode *> s1;
stack<TreeNode *> s2;
s1.push(root);
while (!s1.empty()) {
TreeNode *node = s1.top();
s1.pop();
s2.push(node);
if (node->left) s1.push(node->left);
if (node->right) s1.push(node->right);
}
while(!s2.empty()) {
rs.push_back(s2.top()->val);
s2.pop();
}
return rs;
}
};