题目描述
给定一个二叉树,返回它的中序 遍历。
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
样例
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
方法一 递归
时间复杂度:$O(n)$
空间复杂度:$O(n)$
C++ 代码
class Solution {
private:
vector<int> arr;
public:
vector<int> inorderTraversal(TreeNode* root) {
inorderTraversalDetail(root);
return arr;
}
void inorderTraversalDetail(TreeNode* root) {
if(root == NULL) return;
inorderTraversalDetail(root->left);
arr.push_back(root->val);
inorderTraversalDetail(root->right);
}
};
方法二 栈
时间复杂度:$O(n)$
空间复杂度:$O(n)$
C++ 代码
class Solution {
private:
vector<int> arr;
stack<TreeNode*> st;
public:
vector<int> inorderTraversal(TreeNode* root) {
while(root != NULL || !st.empty()) {
while(root != NULL) {
st.push(root);
root = root->left;
}
root = st.top();
st.pop();
arr.push_back(root->val);
root = root->right;
}
return arr;
}
};
方法三 Morris算法
时间复杂度:$O(n)$
空间复杂度:$O(1)$
C++ 代码
class Solution {
private:
vector<int> arr;
public:
vector<int> inorderTraversal(TreeNode* root) {
while(root != NULL) {
if(root->left == NULL) {
arr.push_back(root->val);
root = root->right;
} else {
TreeNode* pre = root->left;
while(pre->right != NULL && pre->right != root) pre = pre->right;
if(pre->right == NULL) {
pre->right = root;
root = root->left;
} else {
// pre->right == root
pre->right = NULL;
arr.push_back(root->val);
root = root->right;
}
}
}
return arr;
}
};