在C中递归创建并遍历二叉树

2023-12-05

我想创建一个二叉树并通过前序遍历来遍历它,并且我使用递归方法。这些代码可以编译但不能正确运行,我发现它可能无法完成CreateBitree()功能可以,但不知道问题出在哪里。

#include <stdio.h>
#include <malloc.h>

typedef struct BiNode{
    int data;
    struct BiNode *lchild;
    struct BiNode *rchild;    //left and right child pointer
}BiNode;

int CreateBiTree(BiNode *T);
int TraverseBiTree(BiNode *T);

int main() {
    BiNode *t;
    CreateBiTree(t);
    TraverseBiTree(t);
    return 0;
}

int CreateBiTree(BiNode *T) {          //create a binary tree by preorder traversal
    char tmp;
    scanf("%c", &tmp);
    if(tmp == ' ')
    T = NULL;
    else {
        T = (BiNode *)malloc(sizeof(BiNode));
        T -> data = tmp;
        CreateBiTree(T -> lchild);
        CreateBiTree(T -> rchild);
    }
    return 1;
}

int TraverseBiTree(BiNode *T) {        //traverse a binary tree by preorder traversal
    if(T != NULL) {
        printf("%c\n", T -> data);
        TraverseBiTree(T -> lchild);
        TraverseBiTree(T -> rchild);
    }
    return 1;
}

例如,当我输入像“ABC##DE#G##F###”这样的预序序列(“#”表示空格),然后它仍然让我输入时,我认为TraverseBiTree()函数尚未执行。


将指针值分配给函数内的指针在该函数的范围之外不会产生任何影响。这样做:

int CreateBiTree(BiNode *T) { 
  /* ... */
  T = NULL;

与这样做相同:

int func(int i) { 
  /* ... */
  i = 0;

在这些情况下,需要指向参数的指针:

int CreateBiTree(BiNode **T) { 
  /* ... */
  T[0] = NULL;  // or... *T = NULL;

对初始代码进行一些更改:

int main() {
    BiNode *t; 
    CreateBiTree(&t);
    TraverseBiTree(t);
    return 0;
}

int CreateBiTree(BiNode **T) {          //create a binary tree by preorder traversal
    char tmp;
    scanf("%c", &tmp);
    if(tmp == ' ')
    T[0] = NULL;
    else {
        T[0] = (BiNode *)malloc(sizeof(BiNode));
        T[0]-> data = tmp;
        CreateBiTree(&(T[0]->lchild));
        CreateBiTree(&(T[0]->rchild));
    }   
    return 1;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在C中递归创建并遍历二叉树 的相关文章

  • 异步提交或回滚事务范围

    正如许多人所知 TransactionScope当async await Net 中引入了模式 如果我们尝试使用一些它们就会损坏await在事务范围内调用 现在这个问题已经解决了 感谢范围构造函数选项 a 17527759 1178314
  • 当我在 C 中将 long int 赋值给 int 时会发生什么?

    在最近的作业中 我被告知要使用long变量来存储结果 因为它可能是一个很大的数字 我决定在我的系统 英特尔酷睿 i5 64 位 Windows 7 gnu gcc 编译器 上检查这对我来说真的很重要 并发现以下代码 printf sizeo
  • C 中的隐秘结构定义

    我遇到了以下情况迷宫定义 https github com gduarte lkb blob master code stack maze h code typedef struct mazeNode int hasCheese int t
  • 为什么这些冲突出现在以下 XML 的 yacc 语法中

    我有以下 XML 语法 效果很好 program lt ID attribute list gt root root lt ID attribute list gt node list lt ID gt node list node s n
  • 任何reinterpret_cast改变指针值的真实例子?

    根据 C 标准 reinterpret cast一个指针的T 到其他类型的指针Q 可以改变或不改变指针值 https stackoverflow com questions 1863069 casting via void instead
  • Swashbuckle 在 ASP.NET Core 中失败并出现 NotSupportedException 异常

    我跟着这个关于如何在我的 asp net core 2 2 项目中添加 swashbuckle 当我运行该项目时 我收到以下错误 处理请求时发生未处理的异常 NotSupportedException HTTP 方法 GET 和路径 id
  • tmpnam 的 C/C++ 线程安全性?

    我需要使用tmpnamC 中的函数 但我需要了解它的线程安全性 也就是说 如果我有多个线程 每个线程都需要为临时文件获取不同的名称 我是否可以保证每个线程都会收到具有不同名称的文件 tmpnam 仅保证该文件当时不存在 但它可能会在您自己创
  • 如何使用 LINQ 对列表的列表进行分组(例如:List>)

    我知道我可以使用一些 for 循环轻松地做到这一点 但想看看是否有一种方法可以使用流畅的 LINQ 来做到这一点 我试图找出每个子列表中有多少个 我在看Enumerable SequenceEqual http msdn microsoft
  • 如何使用 Unity 动态注册通用类?

    我有一个包含很多类 300 和 BaseClass 的程序集 我想用接口注册一个泛型类 统一后 您必须在 Name如果你想解析接口的对象数组 我想要一个对象数组主视图模型自动地 有没有办法通过反射来自动执行此操作 有什么建议么 示例 伪 p
  • 是否可以将 CMFCToolBar 添加到对话框中?

    我刚刚尝试了将 CToolbar 添加到新 CMFCToolBar 上的对话框的标准方法 但这不起作用 在我深入研究新的实现之前 我想知道它是否真的可行 我不确定你所说的 标准方式 是什么意思 但你当然可以以编程方式做到这一点 In MyD
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • SolrNet:尝试添加和提交时 SolrConnectionException (400) 错误请求

    我已经到了 SolrNet 执行 Add 方法的地步 但是当我尝试 Commit 时 我收到了错误 以下是我的 schema xml 模型 调用它的代码以及我得到的错误 更奇怪的是 尽管出现错误 但在我重新启动 Tomcat 后 该模型仍会
  • QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?

    我遇到了一个让我非常困惑的问题 我在 Windows 7 上使用 Qt Creator 3 1 2 和 Qt 5 3 使用 MSVC 10 0 编译器和 Windows 8 1 调试工具中的 CDB 不确定我是否应该寻找特定于 Window
  • 使用 C# 从文本中删除数字

    我有一个要处理的文本文件 其中有一些数字 我只想要其中的文字 而不是其他任何东西 我成功删除了标点符号 但是如何删除数字呢 我想要使 用 C 代码 另外 我想删除长度大于 10 的单词 如何使用 Reg 表达式来做到这一点 您可以使用正则表
  • 在.NET MVC中,有没有一种简单的方法来检查我是否在主页上?

    如果用户从主页登录 我需要采取特定的操作 在我的 LogOnModel 中 我有一个隐藏字段 Html Hidden returnUrl Request Url AbsoluteUri 在我的控制器中 我需要检查该值是否是主页 在下面的示例
  • MonoMac 窗口关闭时没有错误

    我刚刚开始在 Xamarin Studio 中使用 MonoMac 并且遇到了最奇怪的问题 我有一个带有 NSButton 和 NSTextField 的窗口 至此 我已经删除了按钮上的事件处理程序 因此它不会执行任何操作 除了在单击它时突
  • 为什么删除void*是UB而不是编译错误?

    为什么要通过删除对象void 是未定义的行为 而不是编译错误 void foo void p delete p 这段代码编译并生成代码 尽管有关于 gcc 和 clang 的警告 令人惊讶的是 ICC 没有给出警告 2 5 warning
  • 如何让浏览器后退按钮通过 AJAX 调用带您返回?

    我有一个页面 上面有很多动态生成的复选框 当用户单击这些复选框时 页面上的许多内容会通过 ajax 动态更改 最终用户抱怨 在点击提交然后点击后退按钮更改某些内容后 他们的选择被破坏了 他们必须重新做一遍 我见过一些网站 gmail fac
  • 同时使用多个控制台

    是否有捷径可寻 我现在仅使用控制台测试我的网络应用程序 最好的办法是从一个项目中拥有多个控制台 然后按一下 立即调试 菜单项 我可以像过去一样使用多个项目 但这似乎很笨拙 理想情况下 我可以启动多个控制台实例 从同一线程运行很好 并且让它们
  • printf 右对齐括号内的数字

    我正在编写一个程序 显示数组中的所有信息 它必须以括号中的数组索引开头 例如 2 并且它们必须彼此正确对齐 如果只是数字 我知道你可以这样做 printf 10d index 但是用括号括起来会得到以下输出 1 2 10 11 当我真正希望

随机推荐

  • Python 按值搜索

    我需要一个合适的解决方案来搜索 Python 嵌套数据结构中的键 假设我有一个带有值 check 的变量和这样的字典 SERVICES domain check whois register user create show delete
  • NoClassDefFoundError:com.opencsv.CSVWriter

    我尝试使用 opencsv libray 来获取加密格式数据 但在 CSV writer 上写入时 我收到 NoClassDefFoundError 我看过很多与相同错误相关的帖子 并尝试了几乎所有方法 但仍然无法纠正问题 下面的链接有同样
  • 现在如何使用 Blaze 在 Meteor 模板中的动态字段上使用 X-editable?

    I had x 可编辑在 Meteor 0 7 2 中工作 但自从升级到 0 8 0 后 它不再正确渲染 我往往会得到一堆空标签 这很令人沮丧 因为数据就在那里 只是在渲染函数被触发时还没有
  • 使服务层可以访问对象,而无需在 MVC4 应用程序中作为参数传递

    我正在构建一个多租户 MVC 应用程序 其中有一个应用程序池和一个数据库 我有一个租户表 并且我的每个模型都有一个标识的 TenantId 每个租户都有一个字符串 Url 用于标识用于访问该租户数据的完整 URL 我可以通过以下方式从 Ba
  • 如何对列表重新排序? [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 给定一个任意大小的数组n 我想根据数组的离散索引重新组织数组的元素 Python 示例 Unique array of size n a b c d e
  • 对 Tkinter bind_class 感到困惑

    我定义了 GCanvas Canvas 的扩展 我的目的是在类级别绑定到 GCanvas 它不起作用 我还尝试绑定到 tk Canvas 但它也不起作用 绑定到root或 GCanvas 实例工作正常 这两种选择对我来说都没有用 但我只是尝
  • PowerShell:将 HTML 表提取为 CSV

    我正在尝试将 HTML 表提取到 CSV 文件 我对 PowerShell 了解不多 但在网上我找到了一些示例 但我总是收到相同的错误消息 您不能对空值表达式调用方法 行数 8 字符 1 table oHTML ParsedHtml bod
  • 使用重写规则从 url 中删除 .php

    我想重写 nginx 中的 url 以便 php扩展名可以省略 这就是我所拥有的 但这对我不起作用 有人知道如何做到这一点吗 Thanks server listen 80 server name example com return 30
  • 根据 3 个变量的颜色 - 麦克斯韦三角形

    我有一个由三个变量 u v w 组成的模型 它们随时间和空间而变化 我对这三个变量的比率特别感兴趣 但我宁愿只使用一张图 而不是显示三张图 每张图对应一个变量 我的想法是使用麦克斯韦三角形 颜色三角形 参见http homepages ab
  • ASP.NET Intranet 站点要求提供凭据 - Windows 身份验证

    我在 ASP Net 中创建了我的第一个网站 并且正在尝试在我们工作的 Intranet 上启动并运行它 我现在几乎已经完成了所有事情 但我遇到了障碍 我需要使用 Windows 身份验证 我的团队的要求 因此我完成了设置网站的过程 我已配
  • 对同一对象调用两次 MustHaveHappened 失败

    给定以下被测类 以及关联的 DTO 类和接口 public class Foo private readonly IBar bar public Foo IBar bar bar bar public void DoStuff var dt
  • 如何在项目中包含多个log4j2.xml文件?

    我的项目由多个模块组成 每个模块都可以独立运行并有单独的log4j2 xml 假设 Project X 由三个模块组成 模块 A 有 log4j2 xml 包含 Loggers 和 Appenders 模块 B 有 log4j2 xml 模
  • .vimrc 来源不正确

    我的 vimrc 中有以下几行 colorscheme solarized 这显然设置了日晒配色方案 我实际的 vimrc 肯定比这个长 并且我还指定了更多 Solarized 选项 但是 我面临的问题可以使用这个最小的 vimrc 文件来
  • Linux中DMA如何处理memcpy

    我在程序中使用 memcpy 不幸的是 当我增加变量数量时 CPU 使用率会增加 就好像 memcpy 是通过使用 for 循环迭代来运行的 linux 中也有快速的 memcpy 函数吗 我应该使用补丁并编译内核吗 在某些架构中 CPU
  • Bootstrap 突然不适用于我的 React JS 项目

    突然 引导程序停止了我的项目的工作 我不知道为什么 这是我们的 package json name blankets version 0 1 0 private true dependencies amazon cognito identi
  • 数据卡和U盘或U盘的区别

    我有一张沃达丰数据卡 可以插入 USB 端口 我有 XP 和 Vista 操作系统 并且我正在使用WM DEVICECHANGEWindows 事件 了解 USB 插入和拔出 它对我来说工作得很好 但我无法区分数据卡插入和笔驱动器插入 是否
  • 为了迭代数组,我们应该使用 size_t 还是 ptrdiff_t?

    In this 安德烈 卡尔波夫 Andrey Karpov 的博客文章标题为 About size t and ptrdiff t 他举了一个例子 for ptrdiff t i 0 i lt n i a i 0 不过不知道对不对 好像应
  • 如何在 F# 中将字典“转换”为序列?

    如何将字典 转换 为序列以便可以按键值排序 let results new Dictionary results Add George 10 results Add Peter 5 results Add Jimmy 9 results A
  • Django 垃圾评论

    Django 的评论框架中的反垃圾邮件系统效果如何 你用过吗 它大约可以防止多少百分比的垃圾评论 您还采取其他措施来帮助防止使用 Django 评论框架的网站上出现垃圾评论吗 有一个 Python API 可以Askimet 这就是 Wor
  • 在C中递归创建并遍历二叉树

    我想创建一个二叉树并通过前序遍历来遍历它 并且我使用递归方法 这些代码可以编译但不能正确运行 我发现它可能无法完成CreateBitree 功能可以 但不知道问题出在哪里 include