编程实现二叉树的创建、二叉树的先序、中序、后序遍历方式(递归)、二叉树的销毁。(C语言) 要求: (1)从终端输入二叉树元素序列,建立对应的二叉树(先序方式); (2)采用递归的方式先序遍历、中序遍历和后序遍历二叉树并输出遍历序列; (3)采用递归方式销毁二叉树(后序方式)。
时间: 2024-10-28 13:07:09 浏览: 45
数据结构试验报告用先序中序建立二叉树后序遍历非递归.pdf
5星 · 资源好评率100%
在C语言中,我们可以使用结构体表示二叉树节点,并通过函数实现二叉树的创建、遍历和销毁。以下是基本的实现:
首先,定义二叉树节点结构:
```c
typedef struct TreeNode {
int val; // 节点值
struct TreeNode* left; // 左子树指针
struct TreeNode* right; // 右子树指针
} TreeNode;
```
接下来是创建二叉树的函数,接受用户输入的整数序列,构建先序遍历的二叉树:
```c
TreeNode* createTree(int arr[], int n) {
if (n == 0)
return NULL;
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = arr[0];
int i = 1;
// 根据先序遍历特点,根节点左边是左子树,右边是右子树
root->left = createTree(arr + i, n - i);
root->right = createTree(arr + n - i, i);
return root;
}
```
然后,我们实现递归的遍历方式:
1. 先序遍历(根-左-右):
```c
void preOrderTraversal(TreeNode* node) {
if (node != NULL) {
printf("%d ", node->val); // 输出节点值
preOrderTraversal(node->left); // 递归左子树
preOrderTraversal(node->right); // 递归右子树
}
}
```
2. 中序遍历(左-根-右):
```c
void inOrderTraversal(TreeNode* node) {
if (node != NULL) {
inOrderTraversal(node->left); // 递归左子树
printf("%d ", node->val); // 输出节点值
inOrderTraversal(node->right); // 递归右子树
}
}
```
3. 后序遍历(左-右-根):
```c
void postOrderTraversal(TreeNode* node) {
if (node != NULL) {
postOrderTraversal(node->left); // 递归左子树
postOrderTraversal(node->right); // 递归右子树
printf("%d ", node->val); // 输出节点值
}
}
```
最后,对于销毁二叉树,通常我们会采用释放节点内存的方式,由于二叉树的删除操作比较复杂,这里仅给出简单的例子,即先序遍历后销毁当前节点及其子节点(假设`freeNode`是一个用于销毁节点的函数):
```c
void destroyTree(TreeNode* node) {
if (node != NULL) {
destroyTree(node->left); // 递归左子树
destroyTree(node->right); // 递归右子树
freeNode(node); // 销毁节点
}
}
```
注意,这只是一个基础示例,实际应用中还需要处理空节点以及更复杂的二叉树操作。此外,销毁二叉树应该采用非递归的方式,以避免栈溢出。
阅读全文