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

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

  • 相关阅读:
    Django REST framework
    django写入csv并发送邮件
    GC收集器ParNew&CMS
    编写高质量的JavaScript代码
    Vue3.0 declare it using the "emits" option警告
    vue 3.0 router 跳转动画
    vue3.0 element-plus 表格合并行
    element-plus 时间日期选择器 el-date-picker value-format 无效等
    vue3.0中使用,一个元素中是否包含某一个元素。
    vue axios ajax 获取后端流文件下载
  • 原文地址:https://www.cnblogs.com/biankun/p/8615188.html
Copyright © 2011-2022 走看看