Day41[26/3/10]T94二叉树的中序遍历
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
- 树中节点数目在范围
[0, 100]内 -100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
基础知识
“中序遍历”就是:对一棵二叉树,按照「左子树 → 根节点 → 右子树」的顺序,依次访问每个节点。
也叫“中根遍历”。
1. 用一句话记住:前/中/后序,都是“根”的位置
很多人一开始分不清前序、中序、后序,其实只要记住一点:
前中后序,说的是“根节点”在什么时候被访问。
- 前序(Preorder):根在“前”面
访问顺序:根 → 左子树 → 右子树 - 中序(Inorder):根在“中”间
访问顺序:左子树 → 根 → 右子树 - 后序(Postorder):根在“后”面
访问顺序:左子树 → 右子树 → 根
三者的共同点:
都是“先左后右”,只是“什么时候访问根”不一样。
实例
A
/ \
B C
/ \
D E
- 前序(根在前面):
访问顺序:A → B → D → E → C
先访问根,再左子树,再右子树。 - 中序(根在中间):
访问顺序:D → B → E → A → C
先把左子树全部走完,再访问根,再走右子树。 - 后序(根在后面):
访问顺序:D → E → B → C → A
先把左右子树都走完,最后访问根。
解题思路
就用递归,好实现:
首先想明白中序的定义:左子树全部走完,再访问根,再走右子树:
所以函数的执行顺序应该是:
如果左右子树都没有,直接返回数据
进入左子树(等这个子树访问完)
输出根的内容(中序访问)
进入右子树(这个也访问完就没了)
Code
#include <vector>
using namespace std;
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;
traverse(root, res);
return res;
}
private:
void traverse(TreeNode *root, vector<int> &res)
{
if (root == nullptr)
{
return;
}
// 1. 访问左子树
traverse(root->left, res);
// 2. 中序访问
res.push_back(root->val);
// 3. 访问右子树
traverse(root->right, res);
}
};