请你用二叉树的扩展先序序列用c语言实现建立二叉链表存储的二叉树的算法实现
时间: 2024-11-06 07:23:42 浏览: 20
在C语言中,我们可以使用递归的方式结合二叉树的扩展先序遍历(Preorder Traversal with Left-Right-Root Order)来构建二叉链表表示的二叉树。这里是一个简单的实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val; // 节点值
struct TreeNode* left; // 左孩子指针
struct TreeNode* right; // 右孩子指针
} TreeNode;
// 创建一个新的二叉树节点
TreeNode* createNode(int val) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->val = val;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 扩展先序遍历并创建二叉链表
void buildTreeFromPreorder(int preorder[], int size, TreeNode** root) {
if (size == 0 || preorder[size - 1] == -1) { // 标志结束,无更多元素
*root = NULL;
return;
}
TreeNode* rootNode = createNode(preorder[0]);
*root = rootNode;
int index = 1; // 遍历索引从第一个非结束标记开始
while (index < size && preorder[index] != -1) {
TreeNode* node = (*root)->left ? (*root)->left : (*root)->right;
while (node != NULL && preorder[index] > node->val) {
node = node->right;
}
if (node == NULL) {
(*root)->left = createNode(preorder[index++]); // 插入左子树
} else {
(*root)->right = createNode(preorder[index++]); // 插入右子树
node = (*root)->right;
}
}
}
// 打印二叉链表
void printInOrder(TreeNode* node) {
if (node != NULL) {
printInOrder(node->left);
printf("%d ", node->val);
printInOrder(node->right);
}
}
int main() {
int preorder[] = {1, 2, 4, 5, 3, -1}; // 示例扩展先序序列
int size = sizeof(preorder) / sizeof(preorder[0]);
TreeNode* root = NULL;
buildTreeFromPreorder(preorder, size, &root);
printf("Built binary tree in-order traversal:\n");
printInOrder(root);
return 0;
}
```
这个程序首先定义了一个二叉树节点结构,并实现了创建节点、扩展先序遍历和打印二叉链表的功能。`buildTreeFromPreorder`函数接受扩展先序序列数组和其大小,然后通过比较和移动构建出二叉链表。
阅读全文