二叉树应用进阶之折纸(二叉树的右根左遍历)

转载请注明原文地址:

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

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

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

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

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

   

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

 public String[] foldPaper(int n) {
        ArrayList<String> order=new ArrayList<String>();        
        post_in_pre(n,"down",order);
        String[] res=new String[order.size()];
        for(int i=0;i<order.size();++i){
            res[i]=order.get(i);
        }
        return res;
    }
    public void post_in_pre(int n,String val,ArrayList<String> 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次要终止,否则会出现越界的情况。所以以后发现越界时检查数组下标越界没有发现错误的话,要从递归函数的递归边界找疏漏)。

     

转载于:https://www.cnblogs.com/ygj0930/p/6613082.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值