东莞网页制作网站网站打开显示建设中

张小明 2026/1/11 23:13:48
东莞网页制作网站,网站打开显示建设中,网站的页脚什么做,网站编辑做appJava数据结构之树#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进行投诉反馈,一经查实,立即删除!

西宁市网站建设多少钱椒江做国际网站的公司

Linux 系统文件管理与共享全攻略 1. 自动化备份设置 首先,使用以下 crontab 命令提交作业调度: crontab backups完成此操作后,你就设置好了自动化备份。之后,你只需每天在磁带驱动器中放入新磁带,并为每盘磁带贴上合适的标签。 2. 访问 DOS 或 Windows 文件系统 如…

张小明 2026/1/12 2:01:56 网站建设

咸宁市网站建设电子商务网站的建设费用

还在为无法在游戏主机上舒适观看B站视频而烦恼吗?wiliwili这款专为手柄操控设计的第三方跨平台B站客户端,让你在Nintendo Switch、PS4、PSVita及PC上都能畅享B站内容。本文将为你揭秘这款跨平台神器的安装技巧、使用体验和性能优化方案。 【免费下载链接…

张小明 2026/1/12 2:13:34 网站建设

网站开发工具简介中鑫华源建设投资集团网站

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个对比工具,展示传统手动排查PKIX路径问题与使用AI工具的效率差异。功能包括:1. 传统方法步骤演示;2. AI工具自动修复演示;3. …

张小明 2026/1/12 2:18:57 网站建设

企业网站开发汇报天眼查免费查询入口

数字营销:策略、技术与内容的全面解析 一、数字营销新流程与情感监测 数字营销实际上是一种全新的营销流程。潜在客户与营销活动之间存在众多接触点,“培育式”营销模式聚焦于从首次接触到客户产生真正兴趣的这段时间,可能长达数年。为使该模式有效运作,持续监测客户情感…

张小明 2026/1/12 2:27:25 网站建设

泾阳网站建设即墨今天新闻大事

摘要本文主要记录了使用Nsight Compute排查CUDA矩阵乘法性能瓶颈的过程。本文首先简单介绍了Nsight Compute这一工具,然后使用一个实际案例演示了如何使用该工具精确排查是哪一行代码造成的Bank Conflict,并展示了该问题解决后的结果。前情提要本文是CUD…

张小明 2026/1/12 3:38:55 网站建设

做自己的首席安全官的网站关键词

在全球多模态文档解析的激烈竞赛中,百度凭借 PaddleOCR-VL 模型给行业投下了一颗重磅炸弹。这个仅有 0.9B 参数量的轻量级多模态模型,不仅在 OmniDocBench V1.5 榜单上以 92.6 的综合得分登顶全球,更在文本识别、公式识别、表格理解和阅读顺序…

张小明 2026/1/12 3:47:27 网站建设