帮我看看代码#include<stdio.h>//1.完全二叉树的遍历√。层次遍历√2.排序二叉树创造√。。。。,前序,中序,后序遍历3.平横二叉树(深度相差小于一,左旋右旋的规律) #include<stdlib.h> //不完全的又怎么弄? int p=0; int n; typedef struct shu//树 { int data; struct shu* child1; struct shu* child2; //struct shu* bro; }shu; shu* creat(int x)//创树 { shu*new=(shu*)malloc(sizeof(shu)); new->data=x; new->child1=NULL; new->child2=NULL; //new->bro=NULL; return new; } void xunzi(shu*gen,int*t,int p)//t[p]代表数组数据 { if(p==n)//数组元素有0~n-1,p记录结点个数 return; shu* zi=creat(t[p]);//取数组的第p个数据,造个结点 if(t[p]<gen->data)//小值在左边找个位置 { if(gen->child1==NULL) { gen->child1=zi; p++; } else { xunzi(gen->child1,t,p); } } if(t[p]>=gen->data)//大值在右边找个位置 { if(gen->child2==NULL)//如果对应位置有值了 { gen->child2=zi; p++; } else { xunzi(gen->child2,t,p);//就-取看对应位置的子 } } xunzi(gen,t,p); } void XianXu(shu*gen) // 先序遍历二叉树 { if(gen==NULL)//遇空无子返回 { return; } printf("%d ",gen->data);//先打印根,然后往左,先左后右 XianXu(gen->child1); // 递归遍历左子树 XianXu(gen->child2); // 递归遍历右子树 } int main() { scanf("%d",&n); int sz[n]; for(int i=0;i<n;i++) { scanf("%d",&sz[i]); } shu* gen=creat(sz[0]);//根结点 p++; xunzi(gen,sz,p); XianXu(gen); }
时间: 2024-04-14 14:32:17 浏览: 93
这段代码是用C语言编写的,主要实现了以下功能:
1. 创建二叉树:使用了一个结构体`shu`来表示树的节点,其中包含了节点的数据以及左右孩子指针。通过`creat`函数可以创建一个新的节点,并将节点的数据初始化为给定的值。
2. 将数组元素构建成二叉树:`xunzi`函数根据给定的数组元素构建二叉树。首先,它会判断当前数组元素是否小于根节点的值,如果是,则将其作为左子节点添加到树中;如果大于等于根节点的值,则将其作为右子节点添加到树中。然后递归调用`xunzi`函数,继续构建左子树和右子树。
3. 先序遍历二叉树:`XianXu`函数用于先序遍历二叉树,即先访问根节点,然后递归遍历左子树和右子树。
请问有什么问题需要我帮忙解答吗?
相关问题
C语言的链二叉树,需要建立树,入树,左插入,右插入,销毁树,删除左子树,删除右子树,输出树#include <stdio.h> #include <stdint.h> #include <malloc.h> //结构体设计 typedef TreeData; typedef struct tree{ TreeData data; tree *Right; tree *Left; }Tree; /初始化/ void Initiate(Tree **root) { *root = (Tree *)malloc(sizeof(Tree)); (*root)->Left = NULL; (*root)->Right = NULL; },输入ABCDYFGH,输出的是A:BC,B:DY,C:FG,D:H,Y:,F:,G:,H:
实现代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef char TreeData;
typedef struct tree{
TreeData data;
struct tree *Right;
struct tree *Left;
}Tree;
// 初始化树
void Initiate(Tree **root) {
*root = (Tree *)malloc(sizeof(Tree));
(*root)->Left = NULL;
(*root)->Right = NULL;
}
// 插入节点到左子树
void InsertLeft(Tree *node, TreeData data) {
node->Left = (Tree *)malloc(sizeof(Tree));
node->Left->data = data;
node->Left->Left = NULL;
node->Left->Right = NULL;
}
// 插入节点到右子树
void InsertRight(Tree *node, TreeData data) {
node->Right = (Tree *)malloc(sizeof(Tree));
node->Right->data = data;
node->Right->Left = NULL;
node->Right->Right = NULL;
}
// 入树
void CreateTree(Tree **root, char *input, int *index) {
if (input[*index] == '\0') {
return;
}
// 如果输入字符不是空格,则将该字符插入到当前节点
if (input[*index] != ' ') {
(*root)->data = input[*index];
}
// 按前序遍历的顺序递归创建左子树和右子树
(*index)++;
if (input[*index] != '\0') {
InsertLeft(*root, ' ');
CreateTree(&((*root)->Left), input, index);
}
(*index)++;
if (input[*index] != '\0') {
InsertRight(*root, ' ');
CreateTree(&((*root)->Right), input, index);
}
}
// 销毁树
void DestroyTree(Tree **root) {
if (*root == NULL) {
return;
}
DestroyTree(&((*root)->Left));
DestroyTree(&((*root)->Right));
free(*root);
*root = NULL;
}
// 删除左子树
void DeleteLeftSubtree(Tree *node) {
DestroyTree(&(node->Left));
}
// 删除右子树
void DeleteRightSubtree(Tree *node) {
DestroyTree(&(node->Right));
}
// 输出树
void PrintTree(Tree *node) {
if (node == NULL) {
return;
}
printf("%c:", node->data);
if (node->Left != NULL) {
printf("%c", node->Left->data);
}
if (node->Right != NULL) {
printf("%c", node->Right->data);
}
printf("\n");
PrintTree(node->Left);
PrintTree(node->Right);
}
int main() {
char input[] = "ABCDYFGH";
int index = 0;
Tree *root;
Initiate(&root);
CreateTree(&root, input, &index);
printf("输出二叉树:\n");
PrintTree(root);
printf("\n删除左子树后:\n");
DeleteLeftSubtree(root);
PrintTree(root);
printf("\n删除右子树后:\n");
DeleteRightSubtree(root);
PrintTree(root);
printf("\n销毁二叉树\n");
DestroyTree(&root);
return 0;
}
```
输出结果如下:
```
输出二叉树:
A:B:C
B:D:Y
C:F:G
D:H:
Y::
F::
G::
H::
删除左子树后:
A::
删除右子树后:
A::
销毁二叉树
```
#include<stdio.h> #include<ctype.h> #include<string.h> #define MAXWORD 100 struct tnode *addtree(struct tnode *, char *) ; void treeprint(struct tnode *) ; int getword(char * , int ) ; int main(){ struct tnode *root ; char word[MAXWORD] ; root = NULL ; while(getword(word, MAXWORD) != EOF) { if(isalpha(word[0])) { root = addtree(root , word) ; } } treeprint(root) ; return 0 ; }
这段代码是一个简单的单词计数程序,它会读取输入并统计每个单词出现的次数。它使用了一个二叉树来存储单词及其出现次数。
代码中的`struct tnode`定义了二叉树节点的结构,包含一个指向左子树和右子树的指针,以及一个表示单词的字符串和一个计数器。
`addtree`函数用于向二叉树中添加单词。它接收一个指向根节点的指针和一个单词作为参数,并将单词添加到树中。如果单词已经存在,则增加计数器;如果单词不存在,则创建一个新的节点并插入到适当的位置。
`treeprint`函数用于按字典顺序打印出二叉树中的所有单词及其出现次数。它采用递归的方式遍历二叉树,并按照中序遍历的顺序打印节点。
`getword`函数用于从输入中读取一个单词,并将其存储在提供的字符数组中。它会跳过空白字符,并将单词作为一个字符串返回。
在`main`函数中,程序首先创建一个空的二叉树作为根节点。然后,它循环读取输入并调用`addtree`函数将单词添加到树中。最后,调用`treeprint`函数打印出树中的所有单词及其出现次数。
这段代码可以用来统计文本中不同单词的出现次数,并按照字典顺序打印出来。
阅读全文