用c语言编写程序任意输入二叉树T的结点个数和结点值,构造一棵二叉树。采用先序、中序和后序三种递归遍历和层序非递归算法,对创建的二叉树T进行遍历并输出相关序列。
时间: 2024-12-08 20:18:52 浏览: 18
二叉树的指定结点路径
在C语言中,你可以通过以下步骤创建一个二叉树,并对其进行各种遍历:
首先,你需要定义一个二叉树节点结构体,包含一个值域和两个指向左右子节点的指针:
```c
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
```
接着,你可以编写一个函数用于读取用户输入,生成二叉树:
```c
TreeNode* createBinaryTree(int n) {
if (n <= 0) return NULL; // 如果结点数为0或负数,返回空树
TreeNode* root = malloc(sizeof(TreeNode)); // 创建根节点
root->val = getNumFromUser(); // 获取第一个结点值
int numLeftNodes = getNumFromUser() - 1; // 减一是因为已经获取了根节点
if (numLeftNodes > 0) {
root->left = createBinaryTree(numLeftNodes); // 递归构建左子树
}
if (numLeftNodes < n - 1) { // 右子树可能存在
root->right = createBinaryTree(n - numLeftNodes - 1);
}
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);
}
}
```
最后,为了实现层序遍历(非递归),可以使用队列:
```c
void levelOrderTraversal(TreeNode* node) {
if (node == NULL) return;
queue<TreeNode*> q;
q.enqueue(node);
while (!q.isEmpty()) {
TreeNode* temp = q.dequeue();
printf("%d ", temp->val);
if (temp->left) q.enqueue(temp->left);
if (temp->right) q.enqueue(temp->right);
}
}
```
阅读全文