用c语言编写符合下列要求二叉排序树转换为有序的双向链表1.设计目的 (1)了解整个二叉树的直接前驱和直接后继的相关概念。(2)掌握双向链表的存储结构,二叉排序树的特点、存储结构和构造过程。(3)掌握二叉排序树转换为有序双向链表的方法。 2.主要内容: 从键盘或文件输入若干个点,构造一棵二叉排序树,然后将此树转换为一个有序的双向链表,并按顺序输出双向链表中各个结点的值。测试数据: 依次输入52、59、73、28、35、77、11、31 生成如图1所示二叉排序树,转换得到有序双向链表如图2所示。 6 图1二叉排序树 "把"" 加了 图2转换得到的双向链表 3.设计要求: (1)一次输入各个结点的值,建立二叉排序树的二叉链表存储结构。(2)转换过程中,不能创建任何新的结点,只能调整各个节点中指针的指向。的代码
时间: 2024-03-09 10:46:23 浏览: 79
BST,免费源码下载玫瑰c语言,c语言程序
以下是用 C 语言实现将二叉排序树转换为有序双向链表的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉排序树的结构体
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
// 定义双向链表的结构体
struct ListNode {
int val;
struct ListNode *prev;
struct ListNode *next;
};
// 将二叉排序树转换为有序双向链表
void ConvertBSTToDoubleList(struct TreeNode* root, struct ListNode **head) {
if (root == NULL) {
return;
}
static struct ListNode* prev = NULL; // 定义一个静态变量 prev,用于记录前一个节点的指针
ConvertBSTToDoubleList(root->left, head); // 递归遍历左子树
struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode)); // 创建新的链表节点
node->val = root->val;
node->prev = prev; // 将当前节点的前驱指针指向前一个节点
if (prev != NULL) {
prev->next = node; // 将前一个节点的后继指针指向当前节点
}
prev = node; // 更新 prev 指针为当前节点
if (*head == NULL) {
*head = node; // 如果当前节点是双向链表的头节点,更新 head 指针
}
ConvertBSTToDoubleList(root->right, head); // 递归遍历右子树
}
// 释放二叉树的内存
void FreeBinaryTree(struct TreeNode* root) {
if (root == NULL) {
return;
}
FreeBinaryTree(root->left);
FreeBinaryTree(root->right);
free(root);
}
// 释放双向链表的内存
void FreeDoubleList(struct ListNode* head) {
struct ListNode* p = head;
while (p != NULL) {
struct ListNode* tmp = p;
p = p->next;
free(tmp);
}
}
int main() {
// 从键盘输入若干个数,构造二叉排序树
int val;
struct TreeNode* root = NULL;
while (scanf("%d", &val) != EOF) {
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
if (root == NULL) {
root = node;
} else {
struct TreeNode* p = root;
while (1) {
if (val < p->val) {
if (p->left == NULL) {
p->left = node;
break;
} else {
p = p->left;
}
} else {
if (p->right == NULL) {
p->right = node;
break;
} else {
p = p->right;
}
}
}
}
}
// 将二叉排序树转换为有序双向链表,并输出各个节点的值
struct ListNode* head = NULL;
ConvertBSTToDoubleList(root, &head);
struct ListNode* p = head;
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
// 释放内存
FreeBinaryTree(root);
FreeDoubleList(head);
return 0;
}
```
使用以上代码,可以从键盘输入若干个数,构造二叉排序树,然后将其转换为有序双向链表,并按顺序输出各个节点的值。
阅读全文