力扣刷题之二叉树的前中后序遍历

简介: 力扣刷题之二叉树的前中后序遍历

前言


推荐:东哥带你刷二叉树(纲领篇) :: labuladong的算法小抄 (gitee.io)

       代码随想录 (programmercarl.com)

二叉树的前序遍历


f8a395ac0579462987817931c83492f8.png 法一:递归;可以参考我之前写的博客:深入递归对递归有详细介绍.

class Solution {
public:
    //中左右
    vector<int> sz;
    vector<int> preorderTraversal(TreeNode* root) {
      if(root==nullptr)//结束条件
      {
          return sz;
      }
      sz.push_back(root->val);//根
      preorderTraversal(root->left);//左
      preorderTraversal(root->right);//右
      return sz;
    }
};

法二:迭代法

我们先看一下前序遍历

前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。

为什么要先加入 右孩子,再加入左孩子呢? 因为这样出栈的时候才是中左右的顺序。

动画如下:

ceaef0eadbb777ab49adca7e214e6a06.gif

class Solution {
public:
     //根左右
    vector<int> preorderTraversal(TreeNode* root) {
      vector<int> sz;
      stack<TreeNode*> az;
      if(root==nullptr)
      {
          return sz;
      }
      az.push(root);
      while(!az.empty())
      {
          TreeNode* node=az.top(); //根
          az.pop();
          sz.push_back(node->val);          
          if(node->right)az.push(node->right);//右
          if(node->left)az.push(node->left);//左
      }
      return sz;
    }
};

image.png

法一:递归

class Solution {
public:
     vector<int> sz;
    vector<int> inorderTraversal(TreeNode* root) {
          if(root==nullptr)
          {
              return  sz;
          }
          inorderTraversal(root->left);
            sz.push_back(root->val);
          inorderTraversal(root->right);
          return sz;
    }
};

法二:迭代

为了解释清楚,我说明一下 刚刚在迭代的过程中,其实我们有两个操作:

  1. 处理:将元素放进sz数组中
  2. 访问:遍历节点

分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,因为要访问的元素和要处理的元素顺序是一致的,都是中间节点。

那么再看看中序遍历,中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进sz数组中),这就造成了处理顺序和访问顺序是不一致的。

那么在使用迭代法写中序遍历,就需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素。

动画如下:

09b1815a536c36760bd192995b996898.gif

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

二叉树的后序遍历


image.png

法一:递归

class Solution {
public: 
    vector<int> az;
    vector<int> postorderTraversal(TreeNode* root) {
        if(root==nullptr)
        {
            return az;
        }
        postorderTraversal(root->left);
        postorderTraversal(root->right);
        az.push_back(root->val);
        return az;
    }
};

法二:迭代

再来看后序遍历,先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图:

image.png

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
    vector<int> az;
    stack<TreeNode*> sz;
    if(root==nullptr)
    {
        return az;
    }
    sz.push(root);
    while(!sz.empty())
    {
        TreeNode *node=sz.top();
        sz.pop();
        az.push_back(node->val);
        if(node->left) sz.push(node->left);
        if(node->right)sz.push(node->right);
    }
     reverse(az.begin(),az.end());
     return az;
   }
};
相关文章
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
38 1
|
2月前
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
20 2
|
2月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
21 0
|
2月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
15 0
|
2月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
18 0
|
2月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
21 0
|
2月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
19 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
60 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
121 2