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;
    }

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

  • 相关阅读:
    堆排序优化与几个排序算法时间复杂度
    冒泡排序的实现和优化及其与插入,选择排序的比较
    插入排序的实现与优化并和选择排序进行性能比较
    选择排序的实现以及性能测试
    MD5加密
    低功耗蓝牙BLE [学习笔记]
    反编译[学习笔记]
    Android 混淆[学习笔记]
    北大SQL数据库视频课程笔记
    repo/git Android/CyanogenMod srouce code
  • 原文地址:https://www.cnblogs.com/biankun/p/8615188.html
Copyright © 2011-2022 走看看