zoukankan      html  css  js  c++  java
  • 试验总结1 改变递归函数中的执行内容

      在做数据结构慕课《03-树3 Tree Traversals Again》这道题时,我的思路是先构造好树,而后直接用PostOrderTraversal(BinTree BT)进行后序遍历。课上所讲的后序遍历递归实现方法是这样的——

    void PostOrderTraversal(BinTree BT)
    {
        if(BT){
            PostOrderTraversal(BT->Left);
            PostOrderTraversal(BT->Right);
            printf("%d\n", BT->Data);
        }
    }

      不过这样一来就有问题,题目中有明确的输出格式要求(“All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.”)。如果是循环方式很容易想到在循环中进行判断并执行相应操作,可是递归函数中每次递归都是再进入相同的函数,若是直接在函数中进行标记判断每次进入该函数时标记变量又会被重置,循环中用到的方法很明显是不可行的。于是我想到了用全局变量。

      如下所示,在函数外定义好标志变量count,将PostOrderTraversal(BinTree BT)函数传入值增加一个标志位参数,且该函数最后也要返回改变后的count值。需要注意的是这样一改变之后每次调用该后序遍历函数时必须变成count = PostOrderTraversal(BT->Left, count); 以实现count数据的传送更新。

    int count = 1int PostOrderTraversal(BinTree BT, int count)
    {
        if(BT){
            count = PostOrderTraversal(BT->Left, count);
            count = PostOrderTraversal(BT->Right, count);
            if(count == 1){
                printf("%d", BT->Data);
                count++;
            }
            else
                printf(" %d", BT->Data);
        }
        return count;
    }

       这样就实现了第一个数和之后的数输出格式的不同。

  • 相关阅读:
    onpropertychange与onchange事件应用
    HttpWorkerRequest实现大文件上传asp.net
    JQuery中对option的添加、删除、取值
    "分析 EntityName 时出错"的解决方法
    asp.net断点续传
    直接在ASP.net中上传大文件的方法
    ASP.NET中文件上传下载方法集合
    asp.net .ashx文件使用Server.MapPath解决方法
    FF与IE下javascript计算屏幕尺寸
    处理顶点——为赛道创建顶点
  • 原文地址:https://www.cnblogs.com/biankun/p/8615188.html
Copyright © 2011-2022 走看看