leetcode94. 二叉树的中序遍历,递归法+迭代法。附带前序遍历方法

leetcode94. 二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
在这里插入图片描述
输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:
输入:root = []
输出:[]

示例 3:
输入:root = [1]
输出:[1]

一般思路:我们当初在学数据结构时的方法就是递归解决。先递归遍历左子树,然后递归访问根节点,最后递归遍历右子树。所谓中序、先序、后序的递归遍历只需要更改
res.push_back(node->val);
的位置即可。
完整代码如下:

class Solution {
public:
    void inorder(TreeNode* node,vector<int> &res)
    {
        if(!node) return ;
        inorder(node->left,res);
        res.push_back(node->val);
        inorder(node->right,res);
        return ;
    }
    vector<int> inorderTraversal(TreeNode* root) {
    vector<int> res;
    if(root==NULL) return res;
    inorder(root,res);
    return res;
    }
};

我们可以将递归改写成迭代。
所谓迭代法,我们要使用到栈数据结构。具体来说,中序遍历就是把左子树的所有节点存入栈中,到底后再一个个弹出来,弹出来的过程中每弹出来一个,把根遍历后,把根的右子树也都存入栈中

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
    stack<TreeNode*> stk;
    vector<int> res;
    while(root!=nullptr || !stk.empty())
    {
        while(root!=nullptr)
        {
            stk.push(root);
            root=root->left;
        }
        root=stk.top();
        stk.pop();
        res.push_back(root->val);
        root=root->right;
    }
    return res;
    }
};

迭代法里比较难理解的是对右子树的处理,当左子树节点都被存入栈中之后,我们弹出一个节点,将其放入结果数组后,再处理当前节点的右节点(如果有的话),因为当前节点的右节点也可能存在左节点,如果有的话这些节点应该是在栈中其他节点之前被遍历的。

二叉树的前序遍历迭代法的逻辑也是这样,唯一区别每次节点入栈之前先遍历到结果数组里。

代码如下:

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        if (root == nullptr) {
            return res;
        }

        stack<TreeNode*> stk;
        TreeNode* node = root;
        while (!stk.empty() || node != nullptr) {
            while (node != nullptr) {
                res.push_back(node->val);
                stk.push(node);
                node = node->left;
            }
            node = stk.top();
            stk.pop();
            node = node->right;
        }
        return res;
    }
};

后序遍历迭代法相对将要难一些,我们之后再说。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 16:30:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 16:30:04       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 16:30:04       58 阅读
  4. Python语言-面向对象

    2024-07-17 16:30:04       69 阅读

热门阅读

  1. Spring与设计模式总览

    2024-07-17 16:30:04       19 阅读
  2. Avalonia中的数据验证

    2024-07-17 16:30:04       21 阅读
  3. [ptrade交易实战] 第十五篇 融资融券交易类函数

    2024-07-17 16:30:04       24 阅读
  4. 堆

    2024-07-17 16:30:04      19 阅读
  5. Gmsh概述

    2024-07-17 16:30:04       18 阅读
  6. Linux环境下卸载Redis

    2024-07-17 16:30:04       20 阅读
  7. ODrive学习笔记三——串口流

    2024-07-17 16:30:04       23 阅读
  8. LinkedList

    2024-07-17 16:30:04       21 阅读