一、题目
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
二、思路
如果做过hot100中538那题,这题估计5分钟就做完了。就是普通的中序遍历,左根右,先把左节点放进去,然后把自己放进去,最后右边,递归一下就行了
三、代码
/**
* 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 {
private:
vector<int> sort;
public:
void inorder(TreeNode* root){
if(root==NULL){
return;
}
inorderTraversal(root->left);
sort.push_back(root->val);
inorderTraversal(root->right);
}
vector<int> inorderTraversal(TreeNode* root) {
inorder(root);
return sort;
}
};
四、进阶
在题目下面有注意到用迭代算法解决,但我之前没怎么接触过,先给出两者区别:
递归是函数反复调用自己去解决更小的问题,直至达成结束条件
迭代是用循环(for,while等)重复操作,在不自调用的情况下解决问题
我直接搬来了官方题解,来根据这个分析一下。简单来说就是显式的维护了一个节点栈,通过不断向左深入搜索往栈内存放父节点,触底时挨个取出父节点,再向右搜索
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> stk;
while (root != nullptr || !stk.empty()) { //节点为空,或,栈里还有未处理节点,则继续循环
while (root != nullptr) { //当节点不为空时
stk.push(root); //为之后由子节点返回父节点保留
root = root->left; //一直向左节点深入搜索
}
root = stk.top(); //当节点为空时,root=最近的父节点
stk.pop(); //由于root已经变为父节点,故pop
res.push_back(root->val); //将父节点的值加入res
root = root->right; //继续搜右边
}
return res;
}
};
1386

被折叠的 条评论
为什么被折叠?



