织梦万网网站搬家教程义乌外贸公司网站

张小明 2025/12/27 19:34:27
织梦万网网站搬家教程,义乌外贸公司网站,固原市住房和城乡建设局网站,wordpress设置页面403权限Java数据结构之树#xff1a;二叉树的三种遍历方法详解#xff08;递归与非递归实现#xff09; 目录 一、二叉树遍历的定义与重要性二、前序遍历#xff08;DLR#xff09;详解三、中序遍历#xff08;LDR#xff09;详解四、后序遍历#xff08;LRD#xff09;详解…Java数据结构之树二叉树的三种遍历方法详解递归与非递归实现目录一、二叉树遍历的定义与重要性二、前序遍历DLR详解三、中序遍历LDR详解四、后序遍历LRD详解五、完整代码实现与测试六、性能对比与应用场景七、总结与学习建议一、二叉树遍历的定义与重要性二叉树遍历Binary Tree Traversal是指按照某种顺序访问二叉树中的所有节点使得每个节点都被访问一次且仅一次。遍历是二叉树最基本、最重要的操作是后续进行二叉树搜索、修改、删除等操作的基础。根据访问节点的顺序不同二叉树的遍历主要分为三种方式前序遍历Preorder Traversal根节点 → 左子树 → 右子树中序遍历Inorder Traversal左子树 → 根节点 → 右子树后序遍历Postorder Traversal左子树 → 右子树 → 根节点每种遍历方式都有递归和非递归两种实现方法。递归实现简洁易懂而非递归实现通过使用栈Stack数据结构来模拟递归过程空间效率更高。二、前序遍历DLR详解2.1 前序遍历的定义前序遍历DLRData-Left-Right是二叉树遍历中最直观的方式。其遍历规则为首先访问根节点然后遍历左子树最后遍历右子树对于测试用例ABD##E##C##构建的二叉树A / \ B C / \ D E前序遍历的结果为A B D E C2.2 递归实现publicvoidDLR(BiTreeNoderoot){if(root!null){System.out.print(root.data );// 访问根节点DLR(root.lchild);// 遍历左子树DLR(root.rchild);// 遍历右子树}}代码分析递归实现非常简洁只有三行核心代码时间复杂度O(n)每个节点访问一次空间复杂度O(h)h为树的高度递归调用栈的深度2.3 非递归实现数组模拟栈publicvoidDLR2(){BiTreeNodestack[]newBiTreeNode[20];// 使用数组模拟栈inttop0;BiTreeNodecurrroot;while(curr!null||top0){if(curr!null){System.out.print(curr.data );// 访问当前节点stack[top]curr;// 当前节点入栈currcurr.lchild;// 转向左子树}if(top0){currstack[--top];// 出栈currcurr.rchild;// 转向右子树}}}2.4 非递归实现Java Stack类publicStringDLR3(){StringBuilderresultnewStringBuilder();if(rootnull){return;}StackBiTreeNodestacknewStack();stack.push(root);// 根节点入栈while(!stack.isEmpty()){BiTreeNodecurrstack.pop();result.append(curr.data );// 访问当前节点// 右子树先入栈后处理if(curr.rchild!null){stack.push(curr.rchild);}// 左子树后入栈先处理if(curr.lchild!null){stack.push(curr.lchild);}}returnresult.toString();}注意这里右子树先入栈左子树后入栈因为栈是后进先出LIFO的数据结构这样才能保证先处理左子树。三、中序遍历LDR详解3.1 中序遍历的定义中序遍历LDRLeft-Data-Right的特点是首先遍历左子树然后访问根节点最后遍历右子树对于同一棵二叉树中序遍历的结果为D B E A C重要特性对于二叉搜索树BST中序遍历会得到有序的节点序列。3.2 递归实现publicvoidLDR(BiTreeNoderoot){if(root!null){LDR(root.lchild);// 先遍历左子树System.out.print(root.data);// 再访问根节点LDR(root.rchild);// 最后遍历右子树}}3.3 非递归实现publicStringLDR2(){StringBuilderresultnewStringBuilder();if(rootnull){return;}StackBiTreeNodestacknewStack();BiTreeNodecurrroot;while(!stack.isEmpty()||curr!null){// 一直向左走到底while(curr!null){stack.push(curr);currcurr.lchild;}// 弹出栈顶节点并访问currstack.pop();result.append(curr.data );// 转向右子树currcurr.rchild;}returnresult.toString();}算法思路从根节点开始将路径上的所有节点入栈直到最左边的叶子节点弹出栈顶节点并访问转向该节点的右子树重复上述过程四、后序遍历LRD详解4.1 后序遍历的定义后序遍历LRDLeft-Right-Data的顺序为首先遍历左子树然后遍历右子树最后访问根节点对于同一棵二叉树后序遍历的结果为D E B C A应用场景后序遍历常用于需要先处理子节点再处理父节点的场景如计算目录大小、释放树形结构内存等。4.2 递归实现publicvoidLRD(BiTreeNoderoot){if(root!null){LRD(root.lchild);// 先遍历左子树LRD(root.rchild);// 再遍历右子树System.out.print(root.data);// 最后访问根节点}}4.3 非递归实现双栈法publicStringLRD2(){StringBuilderresultnewStringBuilder();if(rootnull){return;}StackBiTreeNodestack1newStack();// 辅助栈StackBiTreeNodestack2newStack();// 结果栈stack1.push(root);while(!stack1.isEmpty()){BiTreeNodecurrstack1.pop();stack2.push(curr);// 将节点放入结果栈// 左子树先入栈if(curr.lchild!null){stack1.push(curr.lchild);}// 右子树后入栈if(curr.rchild!null){stack1.push(curr.rchild);}}// 从结果栈中弹出得到后序序列while(!stack2.isEmpty()){BiTreeNodecurrstack2.pop();result.append(curr.data );}returnresult.toString();}4.4 非递归实现单栈法publicStringLRD3(){StringBuilderresultnewStringBuilder();if(rootnull){return;}StackBiTreeNodestacknewStack();BiTreeNodecurrroot;BiTreeNodeprevnull;// 记录上一个访问的节点while(!stack.isEmpty()||curr!null){if(curr!null){stack.push(curr);currcurr.lchild;}else{BiTreeNodetempstack.peek();// 如果右子树存在且未被访问if(temp.rchild!nullprev!temp.rchild){currtemp.rchild;}else{// 访问该节点result.append(temp.data );prevstack.pop();}}}returnresult.toString();}五、完整代码实现与测试5.1 二叉树节点类classBiTreeNode{chardata;// 节点数据BiTreeNodelchild,rchild;// 左右孩子指针// 默认构造函数publicBiTreeNode(){}// 带参数的构造函数publicBiTreeNode(chardata){this.datadata;lchildnull;rchildnull;}// 完整构造函数publicBiTreeNode(chardata,BiTreeNodelchild,BiTreeNoderchild){this.datadata;this.lchildlchild;this.rchildrchild;}}5.2 二叉树的构建publicvoidcreateBiTree(Stringinput){pi0;rootcreateBiTreeHelper(input);numcountNodes(root);}privateBiTreeNodecreateBiTreeHelper(Stringinput){if(piinput.length()||input.charAt(pi)#){pi;returnnull;// #表示空节点}BiTreeNoderootnewBiTreeNode(input.charAt(pi));pi;root.lchildcreateBiTreeHelper(input);// 递归构建左子树root.rchildcreateBiTreeHelper(input);// 递归构建右子树returnroot;}构建规则使用先序序列和特殊字符#来表示空节点如ABD##E##C##。5.3 运行结果测试运行截图展示了三种遍历方式的测试结果测试用例构建的二叉树结构A / \ B C / \ D E六、性能对比与应用场景6.1 时间空间复杂度对比遍历方法时间复杂度空间复杂度递归空间复杂度非递归前序遍历O(n)O(h)O(h)中序遍历O(n)O(h)O(h)后序遍历O(n)O(h)O(h)其中n为节点数h为树的高度。最坏情况下树退化为链表h n。6.2 非递归实现的优势空间效率更高避免了递归调用的开销不会栈溢出递归深度过深时可能导致栈溢出更好的控制可以在遍历过程中进行更灵活的操作6.3 应用场景前序遍历复制树结构、表达式树求值中序遍历二叉搜索树的中序输出有序序列后序遍历计算表达式值、释放树内存、文件系统遍历七、总结与学习建议7.1 核心要点总结理解遍历本质二叉树遍历是将树形结构线性化的过程掌握递归思想递归实现简洁直观是理解遍历的基础理解栈的作用非递归实现通过栈模拟递归调用过程注意特殊情况空树、单节点树等边界条件选择合适方法根据实际需求选择递归或非递归实现7.2 学习建议画图辅助理解手动画出遍历路径加深理解调试跟踪过程使用IDE调试功能跟踪遍历过程多种实现方式掌握同一遍历的不同实现方法实际应用练习结合实际问题练习遍历应用7.3 扩展学习二叉树遍历是树形结构的基础建议继续学习层次遍历广度优先搜索线索二叉树平衡二叉树AVL树红黑树B树和B树参考资源Java官方文档 - Stack类数据结构与算法分析算法可视化网站标签#Java数据结构 #二叉树 #树遍历 #算法实现 #数据结构基础如果这篇文章对你有帮助欢迎点赞、收藏和评论有疑问的小伙伴可以在评论区留言交流。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做企业网站制作个人怎么样做网站

Python 3.13字节码反编译终极指南:5分钟快速上手 【免费下载链接】pycdc C python bytecode disassembler and decompiler 项目地址: https://gitcode.com/GitHub_Trending/py/pycdc 还在为Python 3.13编译的字节码文件无法反编译而烦恼吗?&#…

张小明 2025/12/27 21:54:46 网站建设

沈阳网站建设seo优化wordpress外接api

《选哪个》 两大开源数据库,轻舟重剑各扬鞭。 轻舟MySQL融万象,重剑PG破千渊。 向量模型逐浪起,IO异步惊云巅。 更看华夏腾飞处,自主可控有新篇。 下周就进入12月份了,随着2025年即将落幕,又到了一年一…

张小明 2025/12/28 0:56:51 网站建设

成都网站建设方案服务查wordpress模板

一、前言介绍1.1寄存器介绍BKP(backup register,备份寄存器)。备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在…

张小明 2025/12/27 19:10:29 网站建设

阿里云服务器发布网站校园网站建设方案模板下载

LaserGRBL激光雕刻软件:从入门到精通的完整指南 【免费下载链接】LaserGRBL Laser optimized GUI for GRBL 项目地址: https://gitcode.com/gh_mirrors/la/LaserGRBL LaserGRBL是一款专为GRBL控制器优化的激光雕刻软件,通过直观的用户界面让复杂的…

张小明 2025/12/27 13:57:40 网站建设

怎样修wordpress插件页脚济南外贸seo

Excalidraw医疗信息系统集成图绘制案例 在一次区域医疗信息化项目的启动会上,技术团队、医院信息科负责人和三家外部系统供应商围坐在虚拟会议室中。会议议题是明确HIS、LIS、PACS三大核心系统的对接方案。传统做法往往是各说各话——开发人员讲接口协议&#xff0c…

张小明 2025/12/27 7:03:12 网站建设

做网站私活多少钱wordpress如何搭建网站

Puppeteer-Sharp 终极指南:从零到精通的完全掌握 【免费下载链接】puppeteer-sharp hardkoded/puppeteer-sharp: Puppeteer-Sharp 是 .NET 中的一个封装库,它提供了对 Google Chrome Puppeteer API 的访问,可用于爬虫抓取、网页自动化、生成预…

张小明 2025/12/27 6:44:39 网站建设