您的位置:首页 > 其它

[LeetCode] Binary Tree Inorder Traversal

2015-06-02 23:22 344 查看
This is a fundamental and yet classic problem. I share my three solutions here:

Iterative solution using stack ---
O(n)
time and
O(n)
space;

Recursive solution ---
O(n)
time and
O(n)
space (considering the costs of call stack);

Morris traversal ---
O(n)
time and
O(1)
space!!!

Iterative solution using stack:

class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> nodes;
TreeNode* curNode = root;
stack<TreeNode*> toVisit;
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;
}
};


Recursive solution:

class Solution {
public:
void inorder(TreeNode* node, vector<int>& nodes) {
if (!node) return;
inorder(node -> left, nodes);
nodes.push_back(node -> val);
inorder(node -> right, nodes);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> nodes;
inorder(root, nodes);
return nodes;
}
};


Morris traversal:

class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> nodes;
TreeNode* curNode = root;
while (curNode) {
if (curNode -> left) {
TreeNode* predecessor = curNode -> left;
while (predecessor -> right && predecessor -> right != curNode)
predecessor = predecessor -> right;
if (predecessor -> right == NULL) {
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: