news 2026/5/23 1:34:38

二叉树的遍历算法

作者头像

张小明

前端开发工程师

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

二叉树的遍历算法

一、算法原理

二叉树遍历是指按照特定的顺序访问树中所有节点的过程,主要分为深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历包括前序遍历、中序遍历和后序遍历,广度优先遍历即层次遍历。

二、 深度优先遍历(DFS)

1.前序遍历(Preorder Traversal)

访问顺序:根节点—>左子树–>右子数
特点:第一个访问的总是根节点。适用于复制树的结构、序列化、或作为前缀表达式(波兰表达式)

递归实现:
//递归实现voidpreOrder(TreeNode*root){if(nullptr==root)return;cout<<root->val<<" ";//访问根节点preOrder(root->left);//遍历左子树preOrder(root->right);//遍历右子树}//迭代实现(使用栈)//迭代思路:使用栈。先将根节点入栈。当栈不为空时,弹出栈顶节点并访问,然后先将其右子节点入栈,//再将其左子节点入栈(栈是后进先出,以保证左子树先被处理)voidpreOrderStack(TreeNode*root){stack<TreeNode*>st;if(root)st.push(root);while(!st.empty()){TreeNode*node=st.top();st.pop();cout<<node->val<<" ";if(node->right)st.push(node->right);if(node->left)st.push(node->left);}}

2.中序遍历(Inorder Traversal)

访问顺序:左子树->根节点->右子树
特点:二叉搜索树进行中序遍历,会得到一个升序序列。这是BST独有的重要性质,常用于排序和范围查询。

递归实现

voidinorder(TreeNode*root){if(nullptr==root)return;inorder(root->left);//遍历左子树cout<<root->val<<" ";//访问根节点inorder(root->right);//遍历右子树}//迭代实现//迭代思路:使用栈。用一个curr指针从根节点开始,沿左子树一直走到最底,并将路径上的节点全部入栈。//然后弹出栈顶节点访问,并将curr指向该节点的右子节点,重复上述过程。voidinorderStack(TreeNode*root){stack<TreeNode*>st;TreeNode*curr=root;while(curr||!st.empty()){while(curr){st.push(curr);curr=curr->left;//左子树入栈}curr=st.top();st.pop();cout<<curr->val<<" ";curr=curr->right;//转向右子树}}

3.后序遍历(PostOrder Traversal)

访问顺序:左子树->右子树->根节点
特点:最后访问根节点。适用于先处理子节点再处理父节点的场景,如释放或删除树、计算目录大小、表达式求值(逆波兰表达式)

递归实现

//递归实现voidpostOrder(TreeNode*root){if(root==nullptr)return;postorder(root->left);// 遍历左子树postorder(root->right);// 遍历右子树cout<<root->val<<" ";// 访问根节点}//迭代实现//迭代思路:使用栈。可以模拟“根->右->左”的顺序进行遍历(类似于变种的前序遍历),然后将结果逆序,//即可得到“左->右->根”的后序结果。另一种经典方法是记录上一个访问的节点,以判断当前节点的右子树是否已被处理。voidpostOrderStack(TreeNode*root){stack<pair<TreeNode*,bool>>st;st.push({root,false});while(!st.empty()){auto[node,visited]=st.top();st.pop();if(node){if(visited){cout<<node->val<<" ";}else{st.push({node,true});st.push({node->right,false});st.push({node->left,false});}}}}}

三、广度优先遍历(BFS)

层次遍历(Level Order Traversal)

按层访问节点,使用队列实现

voidlevelOrder(TreeNode*root){queue<TreeNode*>q;if(root)q.push(root);while(!q.empty()){TreeNode*node=q.front();q.pop();cout<<node->val<<" ";if(node->left)q.push(node->left);if(node->right)q.push(node->root);}}

四、应用场景

  • 前序遍历:复制树结构、表达式树的前缀表示
  • 中序遍历:二叉搜索树的有序输出
  • 后序遍历:释放数内存、表达式数的后缀计算
  • 层次遍历:查找树的高度、层序构件二叉树

五、时间复杂度和空间复杂度

时间复杂度:O(n)(n为节点数)
空间复杂度:递归实现为:O(h)(h为树高), 迭代实现方式 :O(n)

六、调用示例

structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intv):val(v),left(nullptr),right(nullptr){}};TreeNode*buildTree(vector<int>&nums){if(nums.empty())returnnullptr;queue<TreeNode*>q;TreeNode*root=newTreeNode(nums[0]);q.push(root);inti=1;while(!q.empty()&&i<nums.size()){TreeNode*node=q.front();q.pop();//处理左子节点if(i<nums.size()){node->left=newTreeNode(nums[i]);q.push(node->left);}++i;//处理右子树节点if(i<nums.size()){node->right=newTreeNode(nums[i]);q.push(node->right);}++i;}returnroot;}voidfreeTree(TreeNode*root){if(nullptr==root)return;freeTree(root->left);freeTree(root->right);if(root){cout<<"free node:"<<root->val<<" ";deleteroot;root=nullptr;}}voidtree_seach_test(){//构造树vector<int>treeNode={1,2,3,4,5,6,7};TreeNode*root=buildTree(treeNode);//前序遍历算法cout<<"preOrder Start:";preOrder(root);cout<<endl;cout<<"preOrderStack Start:";preOrderStack(root);cout<<endl;//中序遍历算法cout<<"inOrder Start:";inOrder(root);cout<<endl;cout<<"inOrderStack Start:";inOrderStack(root);cout<<endl;//后序遍历算法cout<<"postOrder Start:";postOrder(root);cout<<endl;cout<<"postOrderStack Start:";postOrderStack(root);cout<<endl;//广度优先算法cout<<"BFS Start:";levelOrder(root);cout<<endl;//释放树空间freeTree(root);}intmain(){cout<<"Tree Search Start:"<<endl;tree_seach_test();cout<<endl;getchar();}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 1:34:39

2026最新版默纳克电梯年检试验方法及原理(精准版)

本标准依据TSG T7007-2016《电梯型式试验规则》、TSG T7001—2023《电梯监督检验和定期检验规则》,结合默纳克NICE3000new/NICE5/7000系统最新硬件配置(MCTC-SCB-D全面替代SCB-C)、参数规范及2026年最新检验实操要求制定,涵盖UCMP功能、抱闸制动力监测、门锁短接检测、门旁…

作者头像 李华
网站建设 2026/5/23 1:34:42

如何选择轻量级轮播插件实现响应式设计?前端开发必备解决方案

如何选择轻量级轮播插件实现响应式设计&#xff1f;前端开发必备解决方案 【免费下载链接】slick the last carousel youll ever need 项目地址: https://gitcode.com/GitHub_Trending/sl/slick 在现代前端开发中&#xff0c;轮播组件作为展示图片、产品或内容的核心交互…

作者头像 李华
网站建设 2026/5/23 1:34:46

Spring AI 实战进阶:Ollama+Spring AI 构建离线大模型应用全指南

前言 随着大模型技术的普及&#xff0c;企业对数据安全、隐私合规的要求越来越高&#xff0c;离线部署大模型成为 Java 后端开发者的核心需求。Spring AI 作为 Spring 生态的 AI 集成框架&#xff0c;搭配 Ollama 本地大模型运行工具&#xff0c;可快速构建完全离线、数据不出…

作者头像 李华
网站建设 2026/5/23 1:35:10

为什么 ABAP 开发团队现在要认真看待 AI 这项能力

对于很多做 ABAP 开发的人来说,AI 工具早就不再是一个遥远的概念。真正有价值的,不是把一个通用聊天机器人塞进开发流程,而是让 AI 深度嵌入已经熟悉的开发环境、对象模型和企业语境里。SAP Joule for developers, ABAP AI capabilities 的价值正落在这里:它不是一个游离于…

作者头像 李华
网站建设 2026/5/23 1:34:51

【办公类-142-04】20260330插班生word转长表EXCLE(4)新表重制

背景需求&#xff1a; 4月份转了两位插班生进来 之前做了一份word内容提取到excel的代码 【办公类-142-03】20260304插班生word转长表EXCLE&#xff08;3&#xff09;从word表格按行导出列表&#xff0c;提取索引内容。写入EXCLE长表&#xff0c;另存有名字的文件名https://m…

作者头像 李华