94. 二叉树的中序遍历
1.题目描述
给定一个二叉树,返回它的中序 遍历。
示例:
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
2.方法1(递归)
中序遍历:左子节点->根节点->右子节点
3.代码
/**
* 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) {
vector<int> res;
if(root == NULL){
return res;
}
inorder(root,res);
return res;
}
void inorder(TreeNode* root, vector<int> &res){
if(root == NULL){
return;
}
inorder(root->left, res);
res.push_back(root->val);
inorder(root->right,res);
}
};
4.复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)
5.方法2(迭代)
创建一个栈,把左子树的节点依次入栈,遍历到节点为空时,说明到了树的最左子节点。此时栈顶元素出栈加入结果数组,当前节点curr置为右子节点,继续遍历。
6.代码
/**
* 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) {
vector<int> res;
if(root == NULL){
return res;
}
stack<TreeNode*> s;
TreeNode* curr = root;
while(!s.empty() || curr != NULL){
while(curr != NULL){
s.push(curr);
curr = curr->left;
}
curr = s.top();
s.pop();
res.push_back(curr->val);
curr = curr->right;
}
return res;
}
};
7.复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)