列构建二叉树C语言代码
时间: 2023-11-19 11:05:36 浏览: 36
以下是构建二叉树的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
struct TreeNode *createTreeNode(int val) {
struct TreeNode *node = (struct TreeNode *)malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
struct TreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {
if (preorderSize <= 0 || inorderSize <= 0) {
return NULL;
}
int rootVal = preorder[0];
int i;
for (i = 0; i < inorderSize; i++) {
if (inorder[i] == rootVal) {
break;
}
}
struct TreeNode *root = createTreeNode(rootVal);
root->left = buildTree(preorder + 1, i, inorder, i);
root->right = buildTree(preorder + i + 1, preorderSize - i - 1, inorder + i + 1, inorderSize - i - 1);
return root;
}
void inorderTraversal(struct TreeNode *root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
int main() {
int preorder[] = {1, 2, 4, 5, 3, 6, 7};
int inorder[] = {4, 2, 5, 1, 6, 3, 7};
int n = sizeof(preorder) / sizeof(preorder[0]);
struct TreeNode *root = buildTree(preorder, n, inorder, n);
inorderTraversal(root);
return 0;
}
```
这段代码中,我们定义了一个二叉树的结构体`TreeNode`,包含一个整数值`val`和两个指向左右子树的指针`left`和`right`。我们还定义了一个`createTreeNode`函数,用于创建一个新的结点。`buildTree`函数用于构建二叉树,其中`preorder`是前序遍历数组,`inorder`是中序遍历数组,`preorderSize`和`inorderSize`分别是两个数组的大小。`inorderTraversal`函数用于中序遍历二叉树,输出每个结点的值。
在`buildTree`函数中,我们首先判断两个数组的大小是否非负。如果有一个为0,则返回NULL。否则,我们将前序遍历数组的第一个元素作为根结点的值,然后在中序遍历数组中找到根结点的位置。根据中序遍历数组中根结点的位置,我们可以将左右子树分别构建出来。具体地,左子树的前序遍历数组是`preorder + 1`,大小为`i`,中序遍历数组是`inorder`,大小是`i`;右子树的前序遍历数组是`preorder + i + 1`,大小是`preorderSize - i - 1`,中序遍历数组是`inorder + i + 1`,大小是`inorderSize - i - 1`。最后,我们将根结点的左右子树指针分别指向左右子树的根结点。
在主函数中,我们定义了前序遍历数组和中序遍历数组,并调用`buildTree`函数构建二叉树。最后,我们调用`inorderTraversal`函数中序遍历输出每个结点的值。