94. 二叉树的中序遍历(二叉树)(Leetcode刷题笔记)
https://lunan0320.cn
文章目录
题目
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
解题思路 C++(递归法)
/**
* 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:
//中序的递归过程
void traversal(TreeNode* root, vector<int>& res){
//终止条件
if(!root) return;
//左、中、右的顺序
traversal(root->left, res);
res.push_back(root->val);
traversal(root->right, res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
traversal(root, res);
return res;
}
};
解题思路 C++(迭代法)
/**
* 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){
vector<int> res;
stack<TreeNode*> st;
//root为空就直接返回
if(!root) return res;
//设置指针ptr用于遍历
TreeNode* ptr = root;
//指针不为空或者栈不为空
while(ptr!=nullptr || !st.empty()){
//如果指针不为空
if(ptr){
//就一直将左子树入栈,并指针移到左子树上
st.push(ptr);
ptr = ptr->left;
}else{
//指针为空说明到了叶子结点,需要回溯
ptr = st.top();
st.pop();
//此时指针回溯到的入栈
res.push_back(ptr->val);
//指针移到右子树上
ptr = ptr->right;
}
}
return res;
}
};