将二叉搜索树转化排序的双向链表c语言实现
时间: 2023-08-07 21:42:01 浏览: 124
以下是将二叉搜索树转化为排序的双向链表的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
Node* createNode(int data) {
Node* newNode = (Node*) malloc(sizeof(Node));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
void inorderTraversal(Node* root, Node** prev, Node** head) {
if(root == NULL) {
return;
}
inorderTraversal(root->left, prev, head);
if(*prev == NULL) {
*head = root;
} else {
(*prev)->right = root;
root->left = *prev;
}
*prev = root;
inorderTraversal(root->right, prev, head);
}
Node* BSTtoDLL(Node* root) {
Node* prev = NULL;
Node* head = NULL;
inorderTraversal(root, &prev, &head);
return head;
}
void printList(Node* head) {
while(head) {
printf("%d ", head->data);
head = head->right;
}
}
int main() {
Node* root = createNode(4);
root->left = createNode(2);
root->right = createNode(5);
root->left->left = createNode(1);
root->left->right = createNode(3);
Node* head = BSTtoDLL(root);
printf("Sorted Doubly Linked List: ");
printList(head);
return 0;
}
```
这段代码实现了一个二叉搜索树转换为排序的双向链表的函数BSTtoDLL,它采用中序遍历的方式来遍历二叉搜索树,并将每个节点转换为双向链表的节点形式。在这个过程中,我们使用两个指针prev和head来跟踪双向链表的头和尾。最后,我们返回链表的头节点并打印链表。
阅读全文