其他分享
首页 > 其他分享> > 线索二叉树(中序)

线索二叉树(中序)

作者:互联网

线索二叉树的抽象数据类型

1 enum PointerTag{ Link, Thread };
2 typedef struct ThreadNode
3 {
4     char data;
5     enum PointerTag LTag;
6     enum PointerTag RTag;
7     struct ThreadNode* Lchild;
8     struct ThreadNode* Rchild;
9 }BiThrNode, *BiThrTree;/*Threaded Binary Tree Node*/

创建线索二叉树

 1 void CreateTree(BiThrTree* A)
 2 {
 3     char ch = '\0';
 4     scanf(" %c", &ch);
 5     if (ch == '^')
 6     {
 7         (*A) =  NULL;
 8     }
 9     else
10     {
11         (*A) = (BiThrTree)calloc(1, sizeof(BiThrNode));
12         (*A)->data = ch;
13         (*A)->LTag = Link;
14         (*A)->RTag = Link;
15         CreateTree(&(*A)->Lchild);
16         CreateTree(&(*A)->Rchild);
17     }
18 }

二叉树中序线索化

 1 void ThreadTree(BiThrTree A)
 2 {/*二叉树的中序线索化*/
 3     static BiThrTree Pre = NULL;/*局部静态变量 Pre 始终记录刚刚访问过的结点*/
 4     if (A)
 5     {
 6         ThreadTree(A->Lchild);
 7 
 8         if (A->Lchild == NULL)
 9         {
10             A->LTag = Thread;
11             A->Lchild = Pre;
12         }
13         if (Pre != NULL && Pre->Rchild == NULL)
14         {/*当前结点存在,再回头处理上一个右结点为空的线索,让其指向当前结点(根节点)*/
15             Pre->RTag = Thread;
16             Pre->Rchild = A;
17         }
18         Pre = A;
19 
20         ThreadTree(A->Rchild);
21     }
22 }

中序遍历线索二叉树

 1 void InOrderTraverse(BiThrTree A)
 2 {
 3     while (A)
 4     {
 5         while (A->LTag == Link)
 6         {/*中序线索二叉树寻找遍历的首结点*/
 7             A = A->Lchild;
 8         }
 9         printf("%c", A->data);
10         while (A->RTag == Thread && A->Rchild != NULL)
11         {
12             A = A->Rchild;
13             printf("%c", A->data);
14         }
15         A = A->Rchild;
16     }
17 }

源代码

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 enum PointerTag { Link, Thread };
 6 typedef struct ThreadNode
 7 {
 8     char data;
 9     enum PointerTag LTag;
10     enum PointerTag RTag;
11     struct ThreadNode* Lchild;
12     struct ThreadNode* Rchild;
13 }BiThrNode, * BiThrTree;/*Threaded Binary Tree Node*/
14 
15 void CreateTree(BiThrTree* A);/*创建线索二叉树*/
16 void ThreadTree(BiThrTree A);/*二叉树中序线索化*/
17 void InOrderTraverse(BiThrTree A);/*中序遍历线索二叉树*/
18 
19 int main(void)
20 {
21     BiThrTree A = NULL;
22     printf("请输入该二叉树先序遍历序列(用^表示空子树,叶子结点要跟两个^):\n");
23     CreateTree(&A);
24     ThreadTree(A);
25     InOrderTraverse(A);
26     system("pause");
27     return 0;
28 }
29 
30 void CreateTree(BiThrTree* A)
31 {
32     char ch = '\0';
33     scanf(" %c", &ch);
34     if (ch == '^')
35     {
36         (*A) = NULL;
37     }
38     else
39     {
40         (*A) = (BiThrTree)calloc(1, sizeof(BiThrNode));
41         (*A)->data = ch;
42         (*A)->LTag = Link;
43         (*A)->RTag = Link;
44         CreateTree(&(*A)->Lchild);
45         CreateTree(&(*A)->Rchild);
46     }
47 }
48 
49 void ThreadTree(BiThrTree A)
50 {/*二叉树的中序线索化*/
51     static BiThrTree Pre = NULL;/*局部静态变量 Pre 始终记录刚刚访问过的结点*/
52     if (A)
53     {
54         ThreadTree(A->Lchild);
55 
56         if (A->Lchild == NULL)
57         {
58             A->LTag = Thread;
59             A->Lchild = Pre;
60         }
61         if (Pre != NULL && Pre->Rchild == NULL)
62         {/*当前结点存在,再回头处理上一个右结点为空的线索,让其指向当前结点(根节点)*/
63             Pre->RTag = Thread;
64             Pre->Rchild = A;
65         }
66         Pre = A;
67 
68         ThreadTree(A->Rchild);
69     }
70 }
71 
72 void InOrderTraverse(BiThrTree A)
73 {
74     while (A)
75     {
76         while (A->LTag == Link)
77         {/*中序线索二叉树寻找遍历的首结点*/
78             A = A->Lchild;
79         }
80         printf("%c", A->data);
81         while (A->RTag == Thread && A->Rchild != NULL)
82         {
83             A = A->Rchild;
84             printf("%c", A->data);
85         }
86         A = A->Rchild;
87     }
88 }
View Code

 

标签:Pre,Lchild,中序,线索,二叉树,Rchild,NULL,BiThrTree
来源: https://www.cnblogs.com/lvhui123/p/15790906.html