释放二叉树而不使用递归

2024-04-01

指的是这个问题C 中的解除分配二叉树结构 https://stackoverflow.com/questions/32733353/deallocating-binary-tree-structure-in-c?noredirect=1#comment53322817_32733353

struct Node{
    Node *parent;
    Node *next;
    Node *child;
}

我试图释放一棵二叉树。我遇到的问题是分配的对象是 5520,对自由函数的调用次数是 2747。我不知道为什么,它应该真正释放并迭代树中的所有节点,这是我使用的代码

int number_of_iterations =0;
int number_of_deletions =0;
    void removetree(Node *node)
    {
        number_of_iterations++;
        while(node != NULL)
        {
            Node *temp = node;

            if(node->child != NULL)
            {
                node = node->child;
                temp->child = node->next;
                node->next = temp;
            }
            else
            {
                node = node->next;
                remove(temp);
                number_of_deletions++ 
            }
        }
    }

迭代次数为5440次,删除次数为2747次。

新的固定代码:该代码正确吗?

 const Node *next(const Node *node)
    {
        if (node == NULL) return NULL;
        if (node->child) return node->child;

        while (node && node->next == NULL) {
            node = node->parent;
        }

        if (node) return node->next;
        return NULL;
    }

 for ( p= ctx->obj_root; p; p = next(p)) {
      free(p);
     }

如果你的节点确实包含有效的parent指针,那么整个事情就可以以更加紧凑和可读的方式完成

void removetree(Node *node)
{
  while (node != NULL)
  {
    Node *next = node->child;

    /* If child subtree exists, we have to delete that child subtree 
       first. Once the child subtree is gone, we'll be able to delete 
       this node. At this moment, if child subtree exists, don't delete
       anything yet - just descend into the child subtree */

    node->child = NULL;
    /* Setting child pointer to null at this early stage ensures that 
       when we emerge from child subtree back to this node again, we will 
       be aware of the fact that child subtree is gone */

    if (next == NULL)
    { /* Child subtree does not exist - delete the current node, 
         and proceed to sibling node. If no sibling, the current 
         subtree is fully deleted - ascend to parent */
      next = node->next != NULL ? node->next : node->parent;
      remove(node); // or `free(node)`
    }

    node = next;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

释放二叉树而不使用递归 的相关文章

  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 在 O(n) 时间内排序?

    我被这个问题困扰了 2周 知道如何处理它吗 令 L 为 n 个不同整数的列表 假设 L 的 x 的元素在 1 750 范围内 设计线性排序算法对 L 的元素进行排序 我已经尝试过插入排序 但我不确定我的方法是否正确 Construct an
  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • std::bind 重载解析

    下面的代码工作正常 include
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • 沿着“bresenham”线平滑颜色插值

    我正在尝试沿一条线插值颜色 以便给定两个点及其各自的 RGB 值 我可以绘制一条具有平滑颜色渐变的线 使用布雷森纳姆的线条算法 我现在可以绘制线条 但不确定如何开始在两个端点之间插值颜色 以下是 drawLine 函数的一部分 适用于斜率小
  • 返回多个结果集的查询

    我有一个MSSQL数据库并正在运行以下查询 select from projects select from user 上面的查询一次返回两个结果集 我无法单独触发这两个查询 如何在 Java 类中同时处理两个结果集 处理多个的正确代码Re
  • 用 emacs 替换 ssh+screen+editor

    我的目标是远程编写代码 到目前为止 我一直在使用 ssh screen 编辑器 例如 vim 我知道使用本地 emacs 或 vim 可以编辑远程文件 但是 一旦本地 emacs 关闭并且我想重新打开它 或使用另一台计算机打开它 我需要再次
  • 如何调整 matplotlib 中每隔一行子图之间的间距

    我希望水平调整子图之间的空间 特别是在每隔两行之间 我可以使用调整每一行fig subplots adjust hspace n 但是否可以将其应用于每第二行 import matplotlib pyplot as plt fig ax p
  • 如何使用CNN来训练不同大小的输入数据?

    CNN 似乎主要针对固定大小的输入来实现 现在我想用CNN来训练一些不同大小的句子 有哪些常用的方法 以下建议主要与用于计算机视觉任务 特别是识别 的 CNN 相关 但也可能对您的领域有所帮助 我会看看He 等人的 用于视觉识别的深度卷积网
  • Android - onBackPressed() 不工作

    我有一个针对 Android 2 1 构建的应用程序 我想覆盖后退按钮 我按照这里的例子 http android developers blogspot com 2009 12 01 archive html http android d
  • tkinter tkMessageBox html 链接

    我在 python tkinter 应用程序中出现了 tkMEssagebox showerror 当有人无法使用应用程序登录时 tkMessageBox showerror 中是否可以有 url 链接 ie tkMessageBox sh
  • 代码说“尝试比较数字<=实例”

    It says Players ninjafox56 PlayerGui Shop ShopGui LightSide ChooseSideL 5 尝试比较数字 Rank game Players LocalPlayer leadersta
  • 使用 Jenkins Sonar 插件成功构建后,Sonar 不显示代码覆盖率

    我正在尝试使用 Sonar 和 Jenkins 来获得代码覆盖率 我看到 Jenkins 的 Sonar 插件成功执行了 JUnit 测试用例并成功完成了构建 但 Sonar 不会在项目上显示代码覆盖率结果 代码覆盖率始终显示 0 0 但声
  • 从 firebase 数据库 flutter 读取项目列表

    我正在尝试从此数据库中构建项目列表 但我收到此错误 TypeError type List
  • 让 Ada(用 GNAT 编译)从当前目录外部导入文件?

    我正在大学学习编程入门课程 选择的语言是 Ada 我正在 Kate 中编码并使用 GNAT 4 6 3 进行编译 我们必须为我们的程序使用教师提供的库 如下所示 with foo use foo 当然 然后文件foo adb必须包含在与我的
  • Tensorflow-GPU 仍在 CPU 上处理

    Tensorflow GPU 版本 1 4 0 CUDA 版本 8 0 cuDNN v6 0 nvidia smi 的输出 NVIDIA SMI 388 59 Driver Version 388 59 GPU Name TCC WDDM
  • Kendo Grid 层次结构从主网格传递 ID

    我有一个 Kendo 层次网格 其中主网格包含Client详细信息和子网格包含Point of Contacts 我能够通过Client ID从主网格进入子网格Read操作和数据加载正常 然而 问题是在通过的时候出现的Client ID i
  • 存在哪些基于 Python 的仪表板选项? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想在每台服务器上创建一个仪表板来显示其运行状况和一些日常处理的结果 我计划连接 shell 脚本和 Python 程序来收集数据 我认为
  • Jquery匹配具有相同id/class的多个元素

    我正在努力在特定元素的宽度小于 50 时显示消息 但是有多个具有相同类的元素 并且只有页面中的第一个元素显示消息 这是 jsfiddlehttp jsfiddle net MaNdn 23 http jsfiddle net MaNdn 2
  • PHP/MySQL 消息系统

    你好 我正在尝试用 php 和 mysql 制作一个消息系统 mysql表很简单 ID 发件人 接收者 文本 时间戳 我试图让消息传递有点像 Facebook Twitter 所以列表位于 对话 中 并且对话中的最后一条消息被查看 这是我的
  • 如何从 FirebaseAuth 获取 ID 令牌

    我正在从 firebase 数据库中读取一些 Json 文件 并尝试获取当前用户的 ID 令牌以在标头中使用 如下所示 var response await httpClient get url headers Authorization
  • Excel 数据读取器问题、列名称和工作表选择

    我在用Excel 数据阅读器 https exceldatareader codeplex com 将一些数据读入实体框架数据库 下面的代码可以工作 但我需要一些进一步的改进 首先 IsFirstRowAsColumnNames 似乎没有按
  • javaw.exe和eclipse启动问题

    我正在尝试使用 eclipse juno 但即使在阅读了这里的许多页面后 仍然会出现错误 当我尝试使用 C Users eclipse eclipse exe vm JAVA HOME bin javaw exe data C 命令行启动
  • 释放二叉树而不使用递归

    指的是这个问题C 中的解除分配二叉树结构 https stackoverflow com questions 32733353 deallocating binary tree structure in c noredirect 1 com