C语言数据结构:根据前序遍历的顺序建立一颗二叉树,并对二叉树进行前序,中序,以及后序遍历,最后打印输出。
时间: 2024-11-27 11:13:05 浏览: 16
在C语言中,我们通常使用递归的方式来根据前序遍历的顺序构建一棵二叉树。前序遍历的顺序通常是根节点 -> 左子树 -> 右子树,我们可以利用这个特性来逐步构造树。
首先,我们需要定义一个二叉树节点的数据结构,包含一个整数值和左右子节点的指针:
```c
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
```
接下来,我们可以创建一个函数来构建二叉树,假设`preorder`数组存储了前序遍历的结果,`inorder`数组存储了中序遍历结果:
```c
TreeNode* buildTree(int* preorder, int* inorder, int start, int end) {
if (start > end)
return NULL;
// 找到前序序列中的根节点位置
TreeNode* root = &treeArray[preorder[start]];
// 中序遍历找到根节点的左边界
int inRoot = searchInOrder(inorder, start, end, root->val);
// 递归构建左子树和右子树
root->left = buildTree(preorder, inorder, start + 1, inRoot - 1);
root->right = buildTree(preorder, inorder, inRoot + 1, end);
return root;
}
int searchInOrder(int* inorder, int start, int end, int target) {
for (int i = start; i <= end; ++i) {
if (inorder[i] == target)
return i;
}
return start;
}
```
然后,我们可以分别定义前序、中序和后序遍历的函数,并打印出每个节点值:
```c
void preOrderTraversal(TreeNode* root) {
if (root != NULL) {
printf("%d ", root->val);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
}
void inOrderTraversal(TreeNode* root) {
if (root != NULL) {
inOrderTraversal(root->left);
printf("%d ", root->val);
inOrderTraversal(root->right);
}
}
void postOrderTraversal(TreeNode* root) {
if (root != NULL) {
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%d ", root->val);
}
}
// 主函数示例
int main() {
int preorder[] = {1, 2, 4, 5, 3};
int inorder[] = {4, 2, 5, 1, 3};
int n = sizeof(preorder) / sizeof(preorder[0]);
treeArray = (TreeNode*)malloc(n * sizeof(TreeNode));
// 先建立二叉树
buildTree(preorder, inorder, 0, n - 1);
// 遍历并打印结果
printf("Pre-order traversal: ");
preOrderTraversal(treeArray);
printf("\n");
printf("In-order traversal: ");
inOrderTraversal(treeArray);
printf("\n");
printf("Post-order traversal: ");
postOrderTraversal(treeArray);
free(treeArray); // 释放内存
return 0;
}
```
阅读全文