当前位置: 首页 > news >正文

力扣刷题DAY16(二叉树+迭代遍历)

 一、前序遍历

前序:中左右

144. 二叉树的前序遍历

动态过程图示


/*** 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 {
public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> temp;vector<int> res;if (root == nullptr) // 空数return res;temp.push(root);while (!temp.empty()) {TreeNode* t = temp.top();temp.pop();              // 取栈顶res.push_back(t->val);   // 读栈顶,更新resif (t->right != nullptr) // 处理右孩子,先进后出temp.push(t->right);if (t->left != nullptr) // 处理左孩子,后进先出temp.push(t->left);}return res;}
};

复杂度分析

  • 时间复杂度:O(n)。
  • 空间复杂度:O(n)。 

易错点:

        注意空树的情况,如果不单独判断,会导致nullptr进栈,会出现 Line 23: Char 30: runtime error: member access within null pointer of type 'TreeNode' (solution.cpp)。

二、后序遍历 

145. 二叉树的后序遍历

/*** 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 {
public:vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> temp;vector<int> res;if (root == nullptr) // 空数return res;temp.push(root);while (!temp.empty()) {TreeNode* t = temp.top();temp.pop();             // 取栈顶res.push_back(t->val);  // 读栈顶,更新resif (t->left != nullptr) // 处理左孩子,后进先出temp.push(t->left);if (t->right != nullptr) // 处理右孩子,先进后出temp.push(t->right);} // 到这儿,是中右左reverse(res.begin(), res.end()); // 翻转res:左右中return res;}
};

复杂度分析

  • 时间复杂度:O(n)。
  • 空间复杂度:O(n)。 

三、中序遍历

94. 二叉树的中序遍历 

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;TreeNode* node = root;while (node != nullptr || !st.empty()) {// 一路向左走到底while (node != nullptr) {st.push(node);node = node->left;}// 弹出栈顶,访问当前节点node = st.top();st.pop();res.push_back(node->val); // 中// 转向右子树node = node->right;}return res;}
};

复杂度分析

  • 时间复杂度:O(n)。
  • 空间复杂度:O(n)。 

思路解析:
         先一路向左(第二层while),直到没有左子树需要处理了,那就要处理“中”,此时的中其实也就是栈顶,读取然后出栈。然后转向右孩子,然后再一路向左,也就是回到刚开始(第一层while)。

关于第一层的两个条件: 

 

相关文章:

  • NHANES指标推荐:PHDI
  • 数据库blog6_商业数据库下载知识
  • Day 34
  • 【强化学习】#7 基于表格型方法的规划和学习
  • 续位值运算---左移、右移
  • 2025年安克创新Anker社招校招入职测评 | 3天备考、自适应能力cata测评北森题库、安克创造者启航试炼、安克AI能力测评能力测评历年真题
  • 抖音出品AI短剧《牧野诡事》能否给AI短剧带来新一轮爆发?
  • Linux中的nfs
  • Linux(6)——第一个小程序(进度条)
  • python打卡day35@浙大疏锦行
  • ping命令常用参数以及traceout命令
  • Cookie 与 Session
  • 25. 日志装饰器的开发
  • springboot 多模块,打包为一个jar包
  • 细胞冻存的注意事项,细胞冻存试剂有哪些品牌推荐
  • day25JS- es5面向对象、Proxy代理对象
  • 【大模型报错解决】cublasLt ran into an error!
  • CSS定位详解:掌握布局的核心技术
  • Panasonic Programming Contest 2025(AtCoder Beginner Contest 406)D-E 题解
  • 【Qt开发】进度条ProgressBar和日历Calendar Widget
  • 不良网站进入窗口/列举五种网络营销模式
  • 网站建设服务费怎么做会计分录/聊城优化seo
  • 武汉网站建设工作室/宁波网络推广产品服务
  • 做相册的网站 ppt/云优化seo软件
  • 做任务领积分兑换别的网站上的会员/网络教学平台
  • 太原医疗网站建设/软文的概念是什么