ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线索二叉树(中序)

2022-01-12 04:00:53  阅读:202  来源: 互联网

标签:Pre Lchild 中序 线索 二叉树 Rchild NULL BiThrTree


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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有