94. 二叉树的中序遍历(二叉树)(Leetcode刷题笔记)
欢迎大家访问我的GitHub博客
https://lunan0320.cn
题目
给定一个二叉树的根节点 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]
解题思路 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;
}
};
算法效率
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:8.2 MB, 在所有 C++ 提交中击败了51.25%的用户