线索二叉树(中序)

线索二叉树的抽象数据类型
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 }

浙公网安备 33010602011771号