1. 题目
给定一个二叉树的根节点
root
,返回 它的 中序 遍历
2. 示例
示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]示例 2:
输入:root = [] 输出:[]示例 3:
输入:root = [1] 输出:[1]
3. 分析
1.左子树访问完毕后,才能访问根
2.左树节点先不访问,不为空时就入栈
3.和二叉树的前序遍历不一样的地方在于,入数组的时机不一样:
(1) 前序是入栈时就入数组
(2)中序是出栈时就入数组
![]()
4. 代码实现
/**
* 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:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> ret;
TreeNode* cur = root;
//循环开始,cur指向哪个节点,就表示中序访问这棵树
//1.左路节点入栈
while(cur || !st.empty())
{
while(cur)
{
st.push(cur);
cur = cur->left;
}
//依次取栈中左路节点,这时表示这个节点的左子树已经访问完了
//先访问它,再以子问题的形式访问它的右子树
TreeNode* top = st.top();
st.pop();
ret.push_back(top->val);
//子问题的形式访问这些右子树
cur = top->right;
}
return ret;
}
};