Hot100-Day41-T94二叉树的中序遍历

0 阅读2分钟

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);
    }
};