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

张小明 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进行投诉反馈,一经查实,立即删除!

上海嘉定区网站建设wordpress缓存插件比拼

Granite Docling 258M:如何用轻量化模型解决企业文档智能化的三大痛点? 【免费下载链接】granite-docling-258M 项目地址: https://ai.gitcode.com/hf_mirrors/ibm-granite/granite-docling-258M 在数字化转型浪潮中,企业面临着海量非…

张小明 2025/12/26 1:24:08 网站建设

怎样建立一个营销网站手机页面网站模板怎么卖

9个AI论文工具,MBA轻松搞定学术写作! AI 工具如何助力 MBA 学术写作? 在当今信息爆炸的时代,MBA 学生和研究者面对的学术写作任务日益繁重。无论是论文撰写、开题报告还是数据分析,都需要高效且专业的工具支持。而 AI …

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

网站推广seo福清市建设工程交易网站好像

FaceFusion在短视频平台内容创作中的实际应用案例在抖音、快手、TikTok等平台日更压力与创意内卷并存的今天,一个普通用户如何用一张照片“出演”十位明星的广告大片?一家MCN机构又如何让五名员工“化身”五十个角色,持续产出剧情短剧而不露馅…

张小明 2025/12/27 6:37:21 网站建设

可以自己做免费网站吗广州番禺区属于什么风险地区

SolidWorks 2024终极安装指南:5步快速掌握三维CAD软件部署 【免费下载链接】SolidWorks2024安装教程指南 本仓库提供SolidWorks 2024的安装教程指南及安装包资源。SolidWorks是一款广泛应用于机械设计领域的三维CAD软件,具有强大的功能和易学易用的特点。…

张小明 2025/12/25 22:11:03 网站建设

哪个网站做头像比较好网络营销模式的建议

HunyuanVideo-Foley 项目构建与 Maven 集成实战指南 在短视频创作井喷的今天,一个常被忽视却至关重要的环节浮出水面:音效。无论是脚步踩在雨后街道的“啪嗒”声,还是门缓缓关闭时那低沉的“吱呀”,这些细节决定了内容是否真实、沉…

张小明 2025/12/27 3:34:21 网站建设

抚顺清原网站建设招聘房产信息查询官网

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 实现一个性能对比工具,分别用以下方式处理包含循环引用的复杂对象:1) JSON.stringify replacer 2) 第三方库circular-json 3) 手动解引用 4) AI自动转换。要…

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