C语言实现二元组建树、创建孩子兄弟表示法存储的树并输出这棵树
时间: 2023-12-28 08:04:17 浏览: 118
好的,这个问题我可以回答。二元组建树通常是指使用前序遍历序列和中序遍历序列来构建一棵二叉树。孩子兄弟表示法是一种多叉树的存储方式,每个结点有两个指针,一个指向第一个孩子结点,一个指向它的兄弟结点。
下面是 C 语言实现构建二叉树和将二叉树转化为孩子兄弟表示法存储的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
typedef struct TreeNodeS {
char data;
struct TreeNodeS *firstchild;
struct TreeNodeS *nextsibling;
} TreeNodeS;
// 构建二叉树
TreeNode* buildBinaryTree(char *preorder, char *inorder, int n) {
if (n == 0) return NULL;
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = *preorder;
int p = 0;
while (inorder[p] != *preorder) p++;
root->left = buildBinaryTree(preorder+1, inorder, p);
root->right = buildBinaryTree(preorder+p+1, inorder+p+1, n-p-1);
return root;
}
// 将二叉树转化为孩子兄弟表示法存储
TreeNodeS* convertToChildSibling(TreeNode *root) {
if (root == NULL) return NULL;
TreeNodeS *newroot = (TreeNodeS*)malloc(sizeof(TreeNodeS));
newroot->data = root->data;
newroot->firstchild = convertToChildSibling(root->left);
newroot->nextsibling = convertToChildSibling(root->right);
return newroot;
}
// 输出孩子兄弟表示法存储的树
void printTree(TreeNodeS *root) {
if (root == NULL) return;
printf("%c ", root->data);
printTree(root->firstchild);
printTree(root->nextsibling);
}
int main() {
char preorder[] = "ABDECFG";
char inorder[] = "DBEAFCG";
TreeNode *root = buildBinaryTree(preorder, inorder, 7);
TreeNodeS *newroot = convertToChildSibling(root);
printTree(newroot); // 输出 A B D E C F G
return 0;
}
```
上面的代码中,`buildBinaryTree` 函数使用递归的方式构建二叉树,`convertToChildSibling` 函数使用递归的方式将二叉树转化为孩子兄弟表示法存储,`printTree` 函数递归输出孩子兄弟表示法存储的树。运行代码可以得到输出结果 A B D E C F G。
阅读全文