如何用C语言编写一个二叉树递归遍历程序,包括先序、中序和后序遍历?该程序应能够根据用户从键盘输入构建二叉树,请提供相应的完整代码示例。
时间: 2024-10-27 20:02:13 浏览: 46
在C语言中,我们可以使用结构体来表示二叉树节点,并通过递归函数实现先序、中序和后序遍历。这里是一个简单的例子:
首先,我们定义二叉树节点的结构体:
```c
typedef struct TreeNode {
int val; // 节点值
struct TreeNode* left; // 左孩子指针
struct TreeNode* right; // 右孩子指针
} TreeNode;
```
然后创建一个函数来获取用户输入并建立二叉树:
```c
TreeNode* buildTree(int n) {
if (n <= 0) return NULL;
char input[5];
scanf("%d", &input); // 获取用户输入的第一个数字作为根节点值
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = input;
// 递归构建左子树和右子树
root->left = buildTree(n - 1);
root->right = buildTree(n - 1);
return root;
}
```
接下来是三种遍历方式的递归函数:
1. 先序遍历(根-左-右):
```c
void preOrderTraversal(TreeNode* root) {
if (root != NULL) {
printf("%d ", root->val); // 访问当前节点
preOrderTraversal(root->left); // 遍历左子树
preOrderTraversal(root->right); // 遍历右子树
}
}
```
2. 中序遍历(左-根-右):
```c
void inOrderTraversal(TreeNode* root) {
if (root != NULL) {
inOrderTraversal(root->left); // 遍历左子树
printf("%d ", root->val); // 访问当前节点
inOrderTraversal(root->right); // 遍历右子树
}
}
```
3. 后序遍历(左-右-根):
```c
void postOrderTraversal(TreeNode* root) {
if (root != NULL) {
postOrderTraversal(root->left); // 遍历左子树
postOrderTraversal(root->right); // 遍历右子树
printf("%d ", root->val); // 访问当前节点
}
}
```
最后,你可以结合`buildTree`函数和上述遍历函数使用,如:
```c
int main() {
int n;
printf("Enter the number of nodes: ");
scanf("%d", &n);
TreeNode* root = buildTree(n);
printf("\nPreorder traversal: ");
preOrderTraversal(root);
printf("\nInorder traversal: ");
inOrderTraversal(root);
printf("\nPostorder traversal: ");
postOrderTraversal(root);
free(root); // 清理内存
return 0;
}
```
注意:这个程序假设用户输入的数值不会导致内存溢出,实际应用中需要添加错误处理机制。
阅读全文