描述
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2]
输出:[2,1]
示例 5:
输入:root = [1,null,2]
输出:[1,2]
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
思路一:递归
使用递归,先遍历左,再中,最后右边。
时间复杂度:O(n)
空间复杂度:O(n)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
/*
使用递归的方法
1:首先判断是否为空
2:然后先取左边,中间,右边的值
*/
void inorder(TreeNode* cur,vector<int>& res){
if(cur==nullptr) return; //如果为空就返回
if(cur->left!=nullptr) inorder(cur->left,res); //左遍历
res.push_back(cur->val); //取中间的值
if(cur->right!=nullptr) inorder(cur->right,res); //右遍历
}
vector<int> inorderTraversal(TreeNode* root) {
if(root==nullptr) return {}; //当输入为空时候直接返回
vector<int> res;
inorder(root,res);
return res;
}
};
思路二:迭代法
思路:每到一个节点 A,因为根的访问在中间,将 A 入栈。然后遍历左子树,接着访问 A,最后遍历右子树。
在访问完 A 后,A 就可以出栈了。因为 A 和其左子树都已经访问完成。
思路:
栈S;
p= root;
while(p || S不空){
while(p){
p入S;
p = p的左子树;
}
p = S.top 出栈;
访问p;
p = p的右子树;
}
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res; //用来返回值
stack<TreeNode*> stk; //定义一个栈用来压入数据
if(root==nullptr) return {}; //当为空时候返回
while(root!=nullptr||!stk.empty()){
while(root){
stk.push(root); //根先入栈
root = root->left; //访问左节点
}
root = stk.top(); //头取出
stk.pop(); //头出栈
res.push_back(root->val); //值取出
root = root->right; //根节点
}
return res;
}
};