94. Binary Tree Inorder Traversal
my really bad 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<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> fathers;
vector<int> res;
if (root == NULL) return res;
fathers.push(root);
while(!fathers.empty()) {
TreeNode* tmp = fathers.top();
TreeNode* tmp2 = NULL;
while (tmp->left) {
fathers.push(tmp->left);
tmp2 = tmp;
tmp = tmp->left;
tmp2->left = NULL; //pay attention you need to delete the left node!!
}
res.push_back(tmp->val);
fathers.pop();
if (tmp->right)
fathers.push(tmp->right);
}
return res;
}
};
more beautiful one Iterative solution using stack:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> nodes;
stack<TreeNode*> toVisit;
TreeNode* curNode = root;
while (curNode || !toVisit.empty()) {
if (curNode) {
toVisit.push(curNode);
curNode = curNode -> left;
}
else {
curNode = toVisit.top();
toVisit.pop();
nodes.push_back(curNode -> val);
curNode = curNode -> right;
}
}
return nodes;
}
Morris traversal:
vector<int> inorderTraversal(TreeNode* root) {
TreeNode* curNode = root;
vector<int> nodes;
while (curNode) {
if (curNode -> left) {
TreeNode* predecessor = curNode -> left;
while (predecessor -> right && predecessor -> right != curNode)
predecessor = predecessor -> right;
if (!(predecessor -> right)) {
predecessor -> right = curNode;
curNode = curNode -> left;
}
else {
predecessor -> right = NULL;
nodes.push_back(curNode -> val);
curNode = curNode -> right;
}
}
else {
nodes.push_back(curNode -> val);
curNode = curNode -> right;
}
}
return nodes;
}