![](/img/trans.png)
[英]In Order and Pre Order Traversal of Binary Search Tree without recursion in C?
[英]Trying to build a tree out of a pre order traversal which is stored in a binary file?
我有一个二进制文件的例子:
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
,并将该信息写入新分配的struct Tnode
。process_node
现在将递归调用自己,但这次函数调用的函数参数将是它的right
成员变量的地址。 这样,新调用的函数将改为写入该地址。 如果节点没有右孩子,则right
成员变量设置为NULL
。在所有递归函数调用返回后,您应该有一个完全构建的二叉树。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.