线索二叉树:二叉搜索树转换为双向链表

对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点。

思路:

采用递归思想,对于二叉搜索树,将左、右子树分别转换为双向链表,左子树转换所得链表的头结点即整个树的头结点,左子树转换所得链表的尾节点与根节点相邻;右子树转换所得链表的尾节点即整个树的尾节点,右子树转换所得链表的头结点与根节点相邻。
152847403

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <stdlib.h> 
#include <stdio.h>

typedef struct TNode
{
int value;
TNode* lchild;
TNode* rchild;
}TNode,*BTree;

//二叉树转换为双向链表
TNode* TreeToList(BTree tree,TNode* &lastNode)
{
TNode* head;
//若树为空,返回空
if (tree == NULL)
{
lastNode = NULL;
return NULL;
}
//若无左子树,则该根节点为链表的头结点
if (tree->lchild==NULL)
{
head = tree;
}
//若有左子树,递归调用转换函数将左子树转换为双向链表
//左子树转换所得链表的头结点是整个树的头结点
//左子树链表的尾结点与根节点相邻
else
{
head = TreeToList(tree->lchild,lastNode);
tree->lchild = lastNode;
lastNode->rchild = tree;
}
//若无右子树,则该根节点为链表的尾结点
if (tree->rchild==NULL)
{
lastNode = tree;

}
//若有右子树,递归调用转换函数将左子树转换为双向链表
//右子树转换所得链表的尾结点是整个树的尾结点
//右子树链表的头结点与根节点相邻
else
{
tree->rchild = TreeToList(tree->rchild,lastNode);
tree->rchild->lchild = tree;
}
return head;
}

int main()
{
BTree tree = (BTree)malloc(sizeof(TNode));
tree->value = 4;
tree->lchild = (TNode*)malloc(sizeof(TNode));
tree->lchild->value = 2;
tree->lchild->lchild = (TNode*)malloc(sizeof(TNode));
tree->lchild->lchild->value = 1;
tree->lchild->lchild->lchild = NULL;
tree->lchild->lchild->rchild = NULL;
tree->lchild->rchild = (TNode*)malloc(sizeof(TNode));
tree->lchild->rchild->value = 3;
tree->lchild->rchild->lchild = NULL;
tree->lchild->rchild->rchild = NULL;
tree->rchild = (TNode*)malloc(sizeof(TNode));
tree->rchild->value = 6;
tree->rchild->lchild = (TNode*)malloc(sizeof(TNode));
tree->rchild->lchild->value = 5;
tree->rchild->lchild->lchild = NULL;
tree->rchild->lchild->rchild = NULL;
tree->rchild->rchild = NULL;

TNode* lastNode;
TNode* listHead = TreeToList(tree,lastNode);
TNode* node = listHead;
while(node)
{
printf("%d ",node->value);
node = node->rchild;
}
printf("\n");

return 0;
}

152735920