创建二叉树的C语言实现
下面是一个完整的C语言实现,包括二叉树的创建、遍历和释放内存的代码。

(图片来源网络,侵删)
二叉树结构定义
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct BiTNode {
char data; // 节点数据,假设为字符类型
struct BiTNode *lchild; // 左孩子指针
struct BiTNode *rchild; // 右孩子指针
} BiTNode, *BiTree;
创建二叉树函数
// 创建二叉树(按先序顺序输入,#表示空节点)
BiTree CreateBiTree() {
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL; // 返回空指针
} else {
BiTree T = (BiTree)malloc(sizeof(BiTNode)); // 创建新节点
if (!T) {
printf("内存分配失败!\n");
exit(1);
}
T->data = ch; // 存储数据
T->lchild = CreateBiTree(); // 递归创建左子树
T->rchild = CreateBiTree(); // 递归创建右子树
return T;
}
}
二叉树遍历函数
// 先序遍历
void PreOrderTraverse(BiTree T) {
if (T) {
printf("%c ", T->data); // 访问根节点
PreOrderTraverse(T->lchild); // 遍历左子树
PreOrderTraverse(T->rchild); // 遍历右子树
}
}
// 中序遍历
void InOrderTraverse(BiTree T) {
if (T) {
InOrderTraverse(T->lchild); // 遍历左子树
printf("%c ", T->data); // 访问根节点
InOrderTraverse(T->rchild); // 遍历右子树
}
}
// 后序遍历
void PostOrderTraverse(BiTree T) {
if (T) {
PostOrderTraverse(T->lchild); // 遍历左子树
PostOrderTraverse(T->rchild); // 遍历右子树
printf("%c ", T->data); // 访问根节点
}
}
释放二叉树内存
// 释放二叉树内存
void DestroyBiTree(BiTree T) {
if (T) {
DestroyBiTree(T->lchild); // 释放左子树
DestroyBiTree(T->rchild); // 释放右子树
free(T); // 释放当前节点
}
}
主函数示例
int main() {
BiTree root;
printf("请按先序顺序输入二叉树节点(#表示空节点):\n");
root = CreateBiTree();
printf("\n先序遍历结果: ");
PreOrderTraverse(root);
printf("\n中序遍历结果: ");
InOrderTraverse(root);
printf("\n后序遍历结果: ");
PostOrderTraverse(root);
printf("\n");
DestroyBiTree(root); // 释放内存
return 0;
}
使用示例
假设我们要创建如下二叉树:
A
/ \
B C
/ \ \
D E F
运行程序时,应按先序顺序输入节点,用#表示空节点:
请按先序顺序输入二叉树节点(#表示空节点):
ABD##E##C#F##
程序输出:
先序遍历结果: A B D E C F
中序遍历结果: D B E A C F
后序遍历结果: D E B F C A
注意事项
- 输入时必须严格按照先序顺序,包括空节点用#表示
- 递归实现简单,但对于深度很大的树可能导致栈溢出
- 实际应用中可能需要根据需求修改数据类型(如改为int等)
- 程序结束后记得调用
DestroyBiTree释放内存,避免内存泄漏
这个实现涵盖了二叉树的基本操作,可以根据需要进行扩展或修改。

(图片来源网络,侵删)

(图片来源网络,侵删)
