利用扩展二叉树的中序遍历序列创建一棵二叉树,创建的二叉树可能不唯一,用C语言实现这一代码
时间: 2024-11-15 17:15:02 浏览: 34
在C语言中,我们可以使用递归的方式来实现从扩展二叉树的中序遍历序列重建二叉树。首先,我们需要了解中序遍历的特点,对于二叉搜索树,它的中序遍历结果是升序的节点值。
以下是基本的C语言函数实现:
```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;
}
// 用于构建二叉树的辅助函数
TreeNode* buildTreeUtil(int start[], int end[], int inOrder[], int i, int j) {
if (i > j)
return NULL;
int index = -1;
for (int k = i; k <= j; k++) {
if (inOrder[k] == start[j]) {
index = k;
break;
}
}
TreeNode* node = createNode(start[j]);
node->left = buildTreeUtil(start, end, inOrder, i, index - 1);
node->right = buildTreeUtil(start, end, inOrder, index + 1, j);
return node;
}
// 中序遍历序列重构二叉树
TreeNode* buildTree(int inOrder[], int n) {
// 获取根节点位置
int start[2] = {0, n};
return buildTreeUtil(start, start, inOrder, 0, n - 1);
}
// 打印二叉树
void printInorder(TreeNode* root) {
if (root != NULL) {
printInorder(root->left);
printf("%d ", root->val);
printInorder(root->right);
}
}
int main() {
int inOrder[] = {4, 2, 5, 1, 6, 3}; // 示例的中序遍历序列
int n = sizeof(inOrder) / sizeof(inOrder[0]);
TreeNode* root = buildTree(inOrder, n);
printf("Reconstructed binary tree using Inorder traversal:\n");
printInorder(root);
return 0;
}
```
这个程序首先定义了一个二叉树节点结构体和一些辅助函数,然后在`main`函数中调用`buildTree`函数,传入中序遍历序列,得到重建后的二叉树。注意,因为给定的中序遍历序列可能有多种对应的不同二叉树,所以重建的结果并不唯一。
阅读全文