题目链接
Leetcode.94 二叉树的中序遍历
esay
题目描述
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
- 树中节点数目在范围 [ 0 , 100 ] [0, 100] [0,100] 内
- − 100 < = N o d e . v a l < = 100 -100 <= Node.val <= 100 −100<=Node.val<=100
解法一:递归
直接 左 中 右
的顺序递归即可。
时间复杂度: O ( n ) O(n) O(n)
C++代码:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
function<void(TreeNode*)> dfs = [&](TreeNode* root) ->void{
if(root == nullptr) return;
dfs(root->left);
ans.emplace_back(root->val);
dfs(root->right);
};
dfs(root);
return ans;
}
};
解法二:栈模拟
递归的调用过程是一直往左边走,直到左边走不下去了,就将当前节点 r o o t root root 记录到答案 a n s ans ans 中,然后转向右边,然后右边继续这个过程。
我们用栈 s t k stk stk 来模拟这个过程。
时间复杂度: O ( n ) O(n) O(n)
C++代码:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> stk;
while(!stk.empty() || root){
if(root){
stk.push(root);
root = root->left;
}
else{
TreeNode* node = stk.top();
stk.pop();
ans.emplace_back(node->val);
root = node->right;
}
}
return ans;
}
};