c - 试图从存储在二进制文件中的前序遍历中构建树?
问题描述
我有一个二进制文件的例子:
0000000: 11111011 11111111 11111111 11111111 00000001 11111100 ......
0000006: 11111111 11111111 11111111 00000001 11111101 11111111 ......
000000c: 11111111 11111111 00000001 11111110 11111111 11111111 ......
0000012: 11111111 00000001 11111111 11111111 11111111 11111111 ......
0000018: 00000001 00000000 00000000 00000000 00000000 00000001 ......
000001e: 00000001 00000000 00000000 00000000 00000001 00000010 ......
0000024: 00000000 00000000 00000000 00000001 00000101 00000000 ......
000002a: 00000000 00000000 00000001 00000100 00000000 00000000 ......
0000030: 00000000 00000000 ..
这是同一文件的 txt 表示,其中每一行代表一个节点:
-5 1
-4 1
-3 1
-2 1
-1 1
0 1
1 1
2 1
5 1
4 0
其中第一个数字是节点的值。下一个数字表示该节点有多少个子节点。0 表示没有孩子。1 表示一个正确的孩子。2 表示一个左孩子。3 表示两个孩子。
这是一个节点的结构:
struct Tnode {
int key;
char child;
struct Tnode * left;
struct Tnode * right;
} Tnode;
目前对于每个节点,我尝试使用 fread 两次,一次获取 int 键,然后获取 char 子级。但是,鉴于二叉树包含前序遍历,我如何才能真正构建树呢?我们遇到的第一个节点必须是根节点。因为它旁边有一个 1,所以它只有一个右孩子(这将存储在 char 孩子中)。因此,下一个节点必须是它的右孩子,依此类推。基本上,在这个例子中,右边一直在右边,直到它以 4 结尾。但我在构建它时遇到了麻烦。有小费吗?
解决方案
您可以使用递归解决此问题:
你创建一个函数process_node
,它接受一个参数,它是应该指向新节点的指针的地址。第一次调用该函数时,这将是指向根节点的指针的地址。
该函数process_node
执行以下操作:
- 它为一个分配内存
struct Tnode
。 - 然后它读取
int key
和char child
from 文件并将该信息写入新分配的struct Tnode
. - 然后它将新创建的节点的地址写入它作为函数参数接收的地址(在第一次函数调用时,它是指向根节点的指针的地址)。这样,新节点现在正确链接到树。
- 如果新节点有一个右子节点,那么函数
process_node
现在将递归调用自身,但这次函数调用的函数参数将是其right
成员变量的地址。这样,新调用的函数将改为写入该地址。如果节点没有右孩子,则right
成员变量设置为NULL
。 - 对左孩子重复第 4 步。
- 函数返回。
在所有递归函数调用返回后,您应该有一个完全构建的二叉树。
推荐阅读
- actions-on-google - 品牌验证成功完成,但谷歌控制台上的操作仍然显示:是保留的品牌名称。在此处验证所有权
- python-3.x - Python 日志文件中的变量包含
- php - 如何在 yii basic 中的文件夹上传中将文件上传到服务器。我已经尝试过,但它的 npt 工作
- c# - 选择条件是否仅与一个特定值匹配
- git - GitLab:网站上的“合并预接收挂钩期间出现问题”
- c++ - 为什么 std::remquo 这么慢?
- android - 从 android 调用 Post 请求时,Retrofit 给出空响应
- vue.js - 如何在 Datatables Vuetify 2.0 上的插槽中添加更多属性?
- javascript - 如何使用 Apps 脚本通过电子表格数据自动填充 HTML 字段?
- javascript - Javascript 和 mongo db,如何将条件数组传递给查询