C语言读取文件内容创建二叉树

文件内容格式:

 解释:一行中 如 1 2 3 代表1 有左孩子2, 有右孩子3 ;如2 0 4 代表 2 没有左孩子 ,有右孩子4 

需要注意的是  :你必须按照顺序来进行书写 也就是说 写了 1 2 3 那你必须先写2 即便2 没有左右孩子 也要写成2 0 0 然后再写3 x x,这样才符合我的代码逻辑

上面文件所创建的二叉树样式如下

创建代码如下: 

 

biTree* createInFile() {//从文件中读取二叉树数据,注:文件数据存储为 每一行 根 左孩子 右孩子
	FILE* fp;
	int root, lNode, rNode;//三者分别对应文档中一行中的值,即根和左右孩子
	biTree* T = (biTree*)malloc(sizeof(biTree));
	T->lchild = NULL;
	T->rchild = NULL;
	Squeue* createQueue(int);
	bool isEmpty(Squeue * );
	bool enQueue(Squeue*, biTree*, int);
	bool isEmpty(Squeue*);
	bool deQueue(Squeue*, biTree**, int);
	biTree* p = T;//工作指针
	Squeue* sq = createQueue(MAXSIZE);
	fp = fopen("biTree.txt", "r");//打开文件
	int flag = 0;//判断是否是第一次操作
	while (3 == fscanf(fp, "%d %d %d", &root, &lNode, &rNode))
	{
		!flag++ ? p->data = root : deQueue(sq, &p, MAXSIZE);//利用flag,进而判断是否是读取第一行,因为此时队列无数据
		biTree* left = (biTree*)malloc(sizeof(biTree));//创建左孩子节点指针
		biTree* right = (biTree*)malloc(sizeof(biTree));//创建右孩子节点指针
		if (lNode) {//如果值不为零(0代表没有孩子),创建左孩子并赋值
			left->data = lNode;
			p->lchild = left;//连接孩子
		}
		else {//否则直接将左孩子置为空
			p->lchild = NULL;
		}
		if (rNode) {//如果值不为零,创建右孩子孩子并赋值
			right->data = rNode;
			p->rchild = right;
		}
		else {//否则直接将右孩子置为空
			p->rchild = NULL;
		}
		//把左右孩子入队,方便下次操作
		if (p->lchild)enQueue(sq, p->lchild, MAXSIZE);//左孩子入队
		if (p->rchild)enQueue(sq, p->rchild, MAXSIZE);//左孩子入队
	}
	while (!isEmpty(sq)) {//将剩余节点的左右孩子置为空
		deQueue(sq, &p, MAXSIZE);//取出队首节点
		p->lchild = NULL;
		p->rchild = NULL;
	}
	fclose(fp);
	return T;
}

//先序递归遍历
void preOrder(biTree* T) {
	if (T != NULL) {
		printf("%d ", T->data);
		preOrder(T->lchild);
		preOrder(T->rchild);
	}
}
int main() {
	biTree* T;
	T = createInFile();
	preOrder(T);
	return 0;
}

 如上,易看出用到了队列这个数据结构,所以想要运行,还需队列相关代码,如下:

/*
	此文件用于创建一个顺序队列,出队,入队,判断队空,判断队满等操作
*/
#include <stdio.h>
#include <stdlib.h>
#define TYPE biTree* 
//#define TYPE char
//#define TYPE int

struct biTree {
	char data;
	biTree *lchild;
	biTree *rchild;
};
struct Squeue {
	TYPE *arr;
	int front, rear;
};
//创建队列
Squeue *createQueue(int n) {
	Squeue *sq = ( Squeue *)malloc(sizeof( Squeue));
	sq->arr = (TYPE *)malloc(sizeof(TYPE)*n);//数组大小
	sq->front = 0;
	sq->rear = 0;
	return sq;
}
//判断队满(这里采用牺牲一个存储单元来实现,约定队头指针在队尾指针的下一个位置作为队满的标志)
bool isFull(Squeue *sq, int maxSize) {
	return (sq->rear + 1) % maxSize == sq->front;
}
//判断队空
bool isEmpty(Squeue *sq) {
	return sq->front == sq->rear;
}
//判断队列中元素个数
int count(Squeue *sq, int maxSize) {
	return (sq->rear - sq->front + maxSize) % maxSize;
}
//入队
bool enQueue(Squeue *sq, TYPE data, int maxSize) {
	if (isFull(sq, maxSize)) return false;
	sq->arr[sq->rear] = data;
	sq->rear = (sq->rear + 1) % maxSize;
	return true;
}

//出队
bool deQueue(Squeue *sq, TYPE *data,int maxSize) {
	if (isEmpty(sq)) return false;
	*data = sq->arr[sq->front];
	sq->front = (sq->front + 1) % maxSize;
	return true;
}

//打印队列中元素
//void printQ(Squeue *sq,int maxSize) {
//	if (isEmpty(sq)) return ;
//	int np = sq->front;
//	while (np!=sq->rear) {
//		printf("%d ",sq->arr[np]);
//		np = (np + 1) % maxSize;
//	}
//}

如你想要运行,这两个代码文件均需具备

运行结果如下:先序遍历结果

 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是C语言的完整二叉树创建代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *left; struct node *right; } Node; Node* createNode(int data) { Node *newNode = (Node*) malloc(sizeof(Node)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } Node* insert(Node *root, int data, int index, int n) { if (index <= n) { if (root == NULL) { root = createNode(data); } else { root->left = insert(root->left, data, 2 * index, n); root->right = insert(root->right, data, 2 * index + 1, n); } } return root; } void preOrder(Node *root) { if (root != NULL) { printf("%d ", root->data); preOrder(root->left); preOrder(root->right); } } int main() { Node *root = NULL; int n, data; printf("Enter the number of nodes: "); scanf("%d", &n); printf("Enter the data for each node:\n"); for (int i = 1; i <= n; i++) { scanf("%d", &data); root = insert(root, data, 1, n); } printf("The pre-order traversal of the tree is:\n"); preOrder(root); return 0; } ``` 在该程序中,我们使用了递归来创建完整二叉树。我们首先定义了一个节点结构体,其中包含了节点的值以及左右子节点的指针。然后我们定义了一个函数 `createNode` 用于创建新的节点。接下来,我们定义了 `insert` 函数,该函数会将新节点插入到完整二叉树中。最后,我们定义了 `preOrder` 函数,用于先序遍历该完整二叉树。 在 `main` 函数中,我们首先从用户输入中读取节点数量 `n`,然后逐个读取每个节点的值,并将其插入到完整二叉树中。最后,我们使用 `preOrder` 函数遍历该完整二叉树,并输出其先序遍历结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北街学长

你的鼓励使我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值