使用C语言实现根据前序遍历和中序遍历创建二叉树的代码前序遍历数组为pre中序遍历数组为in大小为n根节点为bintree
时间: 2024-05-09 17:15:49 浏览: 150
下面是使用C语言实现根据前序遍历和中序遍历创建二叉树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
int findRoot(int *in, int n, int rootVal) {
int i;
for (i = 0; i < n; i++) {
if (in[i] == rootVal) {
return i;
}
}
return -1;
}
TreeNode* buildTree(int* pre, int preSize, int* in, int inSize) {
if (preSize == 0 || inSize == 0) {
return NULL;
}
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
int rootVal = pre[0];
int rootIndex = findRoot(in, inSize, rootVal);
root->val = rootVal;
root->left = buildTree(pre+1, rootIndex, in, rootIndex);
root->right = buildTree(pre+rootIndex+1, preSize-rootIndex-1, in+rootIndex+1, inSize-rootIndex-1);
return root;
}
void printInorder(TreeNode* node) {
if (node == NULL) {
return;
}
printInorder(node->left);
printf("%d ", node->val);
printInorder(node->right);
}
int main() {
int pre[] = {1, 2, 4, 5, 3, 6};
int in[] = {4, 2, 5, 1, 3, 6};
int n = sizeof(pre) / sizeof(pre[0]);
TreeNode *root = buildTree(pre, n, in, n);
printf("Inorder traversal of constructed tree is: ");
printInorder(root);
printf("\n");
return 0;
}
```
在这个代码中,我们定义了一个 `TreeNode` 结构体来表示二叉树节点,其中包含节点值 `val`,以及指向左右子树的指针 `left` 和 `right`。
我们首先实现一个辅助函数 `findRoot`,用于查找根节点在中序遍历数组中的位置。然后,我们实现 `buildTree` 函数来递归创建二叉树。该函数首先检查基本情况,即前序遍历数组或中序遍历数组为空,直接返回 `NULL`。否则,它创建一个新的节点作为根节点,并从前序遍历数组中获取根节点值 `rootVal`,然后在中序遍历数组中查找根节点的位置 `rootIndex`。接下来,递归创建左子树和右子树,并将它们分别赋值给根节点的 `left` 和 `right` 指针。
最后,我们定义了一个辅助函数 `printInorder`,用于打印二叉树的中序遍历结果,并在 `main` 函数中调用 `buildTree` 和 `printInorder` 来测试我们的代码。
阅读全文