线索二叉树(中序)

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

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 PreOrderTraverse(BiThrTree A)
 2 {
 3     while (A)
 4     {
 5         while (A->LTag == Link)
 6         {
 7             printf("%c", A->data);
 8             A = A->Lchild;
 9         }
10         printf("%c", A->data);
11         while (A->RTag == Thread && A->Rchild != NULL)
12         {
13             A = A->Rchild;
14         }
15         A = A->Rchild;
16     }
17 }

中序遍历线索二叉树

 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 */
 14 
 15 void CreateTree(BiThrTree* A);/*创建线索二叉树*/
 16 void ThreadTree(BiThrTree A);/*二叉树中序线索化*/
 17 void PreOrderTraverse(BiThrTree A);/*先序遍历线索二叉树*/
 18 void InOrderTraverse(BiThrTree A);/*中序遍历线索二叉树*/
 19 
 20 int main(void)
 21 {
 22     BiThrTree A = NULL;
 23     printf("请输入该二叉树先序遍历序列(用^表示空子树,叶子结点要跟两个^):\n");
 24     CreateTree(&A);
 25 
 26     ThreadTree(A);
 27 
 28     printf("先序遍历:");
 29     PreOrderTraverse(A);
 30     printf("\n中序遍历:");
 31     InOrderTraverse(A);
 32 
 33     system("pause");
 34     return 0;
 35 }
 36 
 37 void CreateTree(BiThrTree* A)
 38 {
 39     char ch = '\0';
 40     scanf(" %c", &ch);
 41     if (ch == '^')
 42     {
 43         (*A) = NULL;
 44     }
 45     else
 46     {
 47         (*A) = (BiThrTree)calloc(1, sizeof(BiThrNode));
 48         (*A)->data = ch;
 49         (*A)->LTag = Link;
 50         (*A)->RTag = Link;
 51         CreateTree(&(*A)->LChild);
 52         CreateTree(&(*A)->RChild);
 53     }
 54 }
 55 
 56 void ThreadTree(BiThrTree A)
 57 {/*二叉树的中序线索化*/
 58     static BiThrTree Pre = NULL;/*局部静态变量 Pre 始终记录刚刚访问过的结点*/
 59     if (A)
 60     {
 61         ThreadTree(A->LChild);
 62 
 63         if (A->LChild == NULL)
 64         {
 65             A->LTag = Thread;
 66             A->LChild = Pre;
 67         }
 68         if (Pre != NULL && Pre->RChild == NULL)
 69         {/*当前结点存在,再回头处理上一个右结点为空的线索,让其指向当前结点(后继结点)*/
 70             Pre->RTag = Thread;
 71             Pre->RChild = A;
 72         }
 73         Pre = A;
 74 
 75         ThreadTree(A->RChild);
 76     }
 77 }
 78 
 79 void PreOrderTraverse(BiThrTree A)
 80 {
 81     while (A)
 82     {
 83         while (A->LTag == Link)
 84         {
 85             printf("%c", A->data);
 86             A = A->LChild;
 87         }
 88         printf("%c", A->data);
 89         while (A->RTag == Thread && A->RChild != NULL)
 90         {
 91             A = A->RChild;
 92         }
 93         A = A->RChild;
 94     }
 95 }
 96 
 97 void InOrderTraverse(BiThrTree A)
 98 {
 99     while (A)
100     {
101         while (A->LTag == Link)
102         {
103             A = A->LChild;
104         }
105         printf("%c", A->data);
106         while (A->RTag == Thread && A->RChild != NULL)
107         {
108             A = A->RChild;
109             printf("%c", A->data);
110         }
111         A = A->RChild;
112     }
113 }
View Code

 

posted @ 2022-01-12 03:37  吕辉  阅读(77)  评论(0)    收藏  举报