news 2026/11/4 22:21:14

二叉树的遍历

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二叉树的遍历

二叉树的遍历

文章目录

  • 二叉树的遍历
    • 深度优先遍历(DFS)
      • 二叉树的前序遍历
      • 二叉树的中序遍历
      • 二叉树的后序遍历
    • 广度优先遍历(BFS)
      • 层序遍历

二叉树是数据结构中的核心概念,遍历二叉树是理解其结构和操作的基础

深度优先遍历(DFS)

二叉树的前序遍历

顺序:根节点 → 左子树 → 右子树(简记为 “根左右”)

ABCDE二叉树的先序遍历序列为:ABDEC

  • 递归实现
// 递归实现class Solution{public:vector<int>preorderTraversal(TreeNode*root){vector<int>result;preorderHelper(root,result);returnresult;}private:voidpreorderHelper(TreeNode*node,vector<int>&result){if(!node){return;}result.push_back(node->val);// 访问根节点preorderHelper(node->left,result);// 遍历左子树preorderHelper(node->right,result);// 遍历右子树}};
  • 迭代实现(使用栈)
// 迭代实现(使用栈)vector<int>preorderTraversalIterative(TreeNode*root){vector<int>result;if(!root){returnresult;}stack<TreeNode*>stk;stk.push(root);while(!stk.empty()){TreeNode*node=stk.top();stk.pop();result.push_back(node->val);// 右子节点先入栈,左子节点后入栈// 保证左子节点先被访问if(node->right){stk.push(node->right);}if(node->left){stk.push(node->left);}}returnresult;}
  • 迭代实现(另一种方式)
// 迭代实现(另一种方式)vector<int>preorderTraversalIterative2(TreeNode*root){vector<int>result;stack<TreeNode*>stk;TreeNode*curr=root;while(curr||!stk.empty()){// 遍历到最左侧节点while(curr){result.push_back(curr->val);// 访问当前节点stk.push(curr);curr=curr->left;}// 回溯并转向右子树curr=stk.top();stk.pop();curr=curr->right;}returnresult;}

二叉树的中序遍历

顺序:左子树 → 根节点 → 右子树(简记为 “左根右”)

ABCDE二叉树的中序遍历序列为:DBEAC

  • 递归
// 递归实现class Solution{public:vector<int>inorderTraversal(TreeNode*root){vector<int>result;inorderHelper(root,result);returnresult;}private:voidinorderHelper(TreeNode*node,vector<int>&result){if(!node)return;inorderHelper(node->left,result);// 遍历左子树result.push_back(node->val);// 访问根节点inorderHelper(node->right,result);// 遍历右子树}};
  • 迭代实现
// 迭代实现vector<int>inorderTraversalIterative(TreeNode*root){vector<int>result;stack<TreeNode*>stk;TreeNode*curr=root;while(curr||!stk.empty()){// 遍历到最左侧节点while(curr){stk.push(curr);curr=curr->left;}// 访问节点并转向右子树curr=stk.top();stk.pop();result.push_back(curr->val);curr=curr->right;}returnresult;}
  • 迭代实现
vector<int>inorderTraversalUnified(TreeNode*root){vector<int>result;stack<TreeNode*>stk;if(root)stk.push(root);while(!stk.empty()){TreeNode*node=stk.top();stk.pop();if(node){// 右中左的顺序入栈if(node->right)stk.push(node->right);// 右stk.push(node);// 中stk.push(nullptr);// 标记节点if(node->left)stk.push(node->left);// 左}else{// 遇到标记,访问节点node=stk.top();stk.pop();result.push_back(node->val);}}returnresult;}

二叉树的后序遍历

顺序:左子树 → 右子树 → 根节点(简记为 “左右根”)

ABCDE二叉树的后序遍历序列为:DEBCA

  • 递归
// 递归实现class Solution{public:vector<int>postorderTraversal(TreeNode*root){vector<int>result;postorderHelper(root,result);returnresult;}private:voidpostorderHelper(TreeNode*node,vector<int>&result){if(!node)return;postorderHelper(node->left,result);// 遍历左子树postorderHelper(node->right,result);// 遍历右子树result.push_back(node->val);// 访问根节点}};
  • 迭代实现(双栈法)
// 迭代实现(双栈法)vector<int>postorderTraversalTwoStacks(TreeNode*root){vector<int>result;if(!root)returnresult;stack<TreeNode*>stk1,stk2;stk1.push(root);while(!stk1.empty()){TreeNode*node=stk1.top();stk1.pop();stk2.push(node);if(node->left)stk1.push(node->left);if(node->right)stk1.push(node->right);}while(!stk2.empty()){result.push_back(stk2.top()->val);stk2.pop();}returnresult;}
  • 迭代实现
// 迭代实现vector<int>postorderTraversalUnified(TreeNode*root){vector<int>result;stack<TreeNode*>stk;if(root)stk.push(root);while(!stk.empty()){TreeNode*node=stk.top();stk.pop();if(node){// 中右左的顺序入栈stk.push(node);// 中stk.push(nullptr);// 标记节点if(node->right)stk.push(node->right);// 右if(node->left)stk.push(node->left);// 左}else{// 遇到标记,访问节点node=stk.top();stk.pop();result.push_back(node->val);}}returnresult;}

广度优先遍历(BFS)

层序遍历

顺序:从上到下,从左到右逐层遍历

// 基本层序遍历(返回一维数组)vector<int>levelOrder(TreeNode*root){vector<int>result;if(!root)returnresult;queue<TreeNode*>q;q.push(root);while(!q.empty()){TreeNode*node=q.front();q.pop();result.push_back(node->val);if(node->left)q.push(node->left);if(node->right)q.push(node->right);}returnresult;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 2:25:28

wangEditor支持pdf书签目录结构导入功能

《一个独立开发者的"Word粘贴大作战"&#xff1a;从抓狂到真香的技术冒险》 ——上海野生程序员的血泪实录 第一章&#xff1a;当甲方爸爸说"要能粘贴Word图片"时&#xff0c;我的表情是这样的 事情是这样的&#xff1a;我独自开发了一个网站&#xff08…

作者头像 李华
网站建设 2026/11/4 8:33:57

网页前端如何通过JSP实现大文件秒传功能?

大文件上传系统开发指南&#xff08;基于原生JSSpringBoot&#xff09; 项目背景 老哥我最近接了个"硬骨头"项目&#xff0c;客户要求实现20G大文件上传下载&#xff0c;还要支持文件夹结构保留、加密传输、断点续传&#xff0c;还要兼容IE9这种古董浏览器。预算只…

作者头像 李华
网站建设 2026/11/4 15:18:12

59、Ubuntu系统全解析:版本、应用与安装指南

Ubuntu系统全解析:版本、应用与安装指南 1. Ubuntu版本介绍 自2004年10月首次发布以来,Ubuntu为其版本选择了独特的命名方式。它摒弃了常见的版本编号,而是采用发布的月份和年份并颠倒顺序来命名。例如,2004年10月的首次发布版本为4.10,随后迅速推出了5.04(2005年4月)…

作者头像 李华
网站建设 2026/11/3 8:20:31

34、Bash脚本中的循环控制与故障排查

Bash脚本中的循环控制与故障排查 1. 循环控制 在Bash脚本中,循环是一种强大的工具,可用于重复执行特定的代码块。下面将介绍 while 、 until 循环以及如何在循环中控制程序流程。 1.1 while 循环 while 循环会在条件为真时持续执行代码块。以下是一个简单菜单程序…

作者头像 李华
网站建设 2026/11/3 22:56:01

直接撸起袖子开干!今天咱们聊聊怎么用LabVIEW整一个带报警记录的上位机监控系统。这玩意儿在工业现场特别实用,尤其是需要24小时盯着设备状态的时候

labview上位机监测报警记录&#xff0c;状态显示。 报警记录存储&#xff0c;存储格式txt。 csv保存文件。先看状态显示部分。LabVIEW的前面板放几个指示灯控件就能实时反映设备状态&#xff0c;比如用绿色圆形表示正常&#xff0c;红色三角表示报警。背后用个While循环不断读取…

作者头像 李华
网站建设 2026/11/4 20:37:42

基于A*算法的无人机三维动态避障路径规划设计,MATLAB编程实现

基于A* 算法的无人机三维路径规划算法&#xff0c;可以动态避障&#xff0c;自己可以规定设计障碍物位置&#xff0c;MATLAB编程实现。 无人机在三维空间耍杂技这事儿&#xff0c;靠的就是路径规划的真功夫。今天咱们来聊个硬核玩法——基于MATLAB实现的A*算法三维动态避障系统…

作者头像 李华