博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树应用进阶之折纸(二叉树的右根左遍历)
阅读量:7026 次
发布时间:2019-06-28

本文共 1028 字,大约阅读时间需要 3 分钟。

转载请注明原文地址:

     前面我们讲了二叉树的几种基础遍历方式——先序遍历(根左右)、中序遍历(左根右)、后序遍历(根左右)。我们发现三种遍历都是左比右先遍历的。如果想让右子树比左子树先遍历呢?其实是一样的,只不过是遍历一个树结点时,处理右儿子的顺序在左儿子之前罢了,至于当前结点则按照需求来放在前、中、后三个位置。

     折纸游戏:拿一张纸条,从下往上对折一次,展开,发现折痕是向下的;然后在对折依次的基础上再对折一次,发现从上往下的折痕依次是“下下上”。

                   问纸条对折N次后展开,求从上往下各条折痕的方向?

    分析:对折其实是在最近一次对折产生的折痕的上下分别再产生一条折痕,并且是上面一条是“向下的”,下方产生的折痕是“向上的”。我们按照折纸的次数来记录当前次折叠产生的折痕,可以得到一棵满二叉树:根节点是下,每个结点的左儿子是上,右儿子是下

   那么从上往下打印纸条的折痕方向,其实就是按照“右——中——左”的顺序去遍历上面的二叉树。

   

   不需要建立二叉树,我们只需在递归遍历时,根据递归顺序(右、中、左)传进不同的方向值即可。 

public String[] foldPaper(int n) {        ArrayList
order=new ArrayList
(); post_in_pre(n,"down",order); String[] res=new String[order.size()]; for(int i=0;i
order){ //折叠n次,递归n次 if(n==0){ return; } //对当前次折叠产生的右儿子是down post_in_pre(n-1,"down",order); //当前折叠的折痕由上一次折叠时传进来的值决定 order.add(val); //当前次折叠产生的左儿子是up post_in_pre(n-1,"up",order); }

 (这里注意:递归n次要终止,否则会出现越界的情况。所以以后发现越界时检查数组下标越界没有发现错误的话,要从递归函数的递归边界找疏漏)。

     

你可能感兴趣的文章
Intellij IDEA 10.5 语言设置
查看>>
Activity 中的Toast在Activity销毁后报错,解决方法,把context改成应用的
查看>>
【381天】跃迁之路——程序员高效学习方法论探索系列(实验阶段138-2018.02.21)...
查看>>
如何给你的OSS资源加上监控
查看>>
【CSS基础】Flex弹性布局
查看>>
分享一些话
查看>>
JAVA泛型笔记
查看>>
LRS+XAPI教育学习记录(安装lrs,以及用xapi传输数据到lrs)
查看>>
微服务设计笔记
查看>>
js异同步
查看>>
ReactOS:基于Windows的开源操作系统
查看>>
CSS那些事儿——居中布局
查看>>
Swift 中的安全性
查看>>
js技术 - 收藏集 - 掘金
查看>>
元数据驱动设计 —— 为动态移动应用创建Web API
查看>>
Apache Kafka:优化部署的10种最佳实践
查看>>
PHP+Redis实战教程(3):list列表类型
查看>>
CSS3 垂直居中详解
查看>>
算法之排序简短总结
查看>>
【css3学习系列】之box-shadow,radial-gradient,linear-gradient
查看>>