二叉树

Binary Tree:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef char Elemtype;
 5 
 6 typedef struct BTNode
 7 {
 8     Elemtype data; 
 9     struct BTNode *lchild, *rchild;
10 } BTNode, *BTree;
11 
12 //创建二叉树,约定使用前序遍历的方式输入数据
13 void CreateBTree(BTree *T)
14 {
15     char c;
16     scanf("%c", &c);
17     if(' '==c)
18     {
19         *T = NULL;
20     }
21     else
22     {
23         *T = (BTNode *)malloc(sizeof(BTNode));
24         (*T)->data = c;
25         CreateBTree(&(*T)->lchild);
26         CreateBTree(&(*T)->rchild);
27     }
28 }
29 
30 //访问二叉树的具体操作
31 void visit(Elemtype data, int level)
32 {
33     printf("%c在第%d层\n", data, level);
34 }
35 
36 //前序遍历二叉树
37 void PreOrderTraverse(BTree T, int level)
38 {
39     if (T)
40     {
41         visit(T->data, level);
42         PreOrderTraverse(T->lchild, level + 1);
43         PreOrderTraverse(T->rchild, level + 1);
44     }
45 }
46 
47 int main()
48 {
49     int level = 1;
50     BTree T ;
51     
52     CreateBTree(&T);
53     PreOrderTraverse(T, level);
54 
55     return 0;
56 }
View Code

线索二叉树:

线索:将那些浪费了空间的结点重新利用,使他们的空指针指向他们各自的前驱和后继结点

  1 //Binary Thread Tree 二叉线索树
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 
  5 typedef char Elemtype;
  6 //线索存储标志位
  7 //Link(0):表示指向左右孩子的指针
  8 //Thread(1):表示指向前驱后继的线索
  9 //enum:枚举类型:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1
 10 typedef enum {Link,Thread} PointerTag;
 11 
 12 
 13 typedef struct BiThrNode
 14 {
 15     Elemtype data; 
 16     struct BiThrNode *lchild, *rchild;
 17     PointerTag ltag;        //左右标志
 18     PointerTag rtag;
 19 } BiThrNode, *BiThrTree;
 20 
 21 //定义全局变量,始终指向刚刚访问过的结点
 22 BiThrTree pre;
 23 
 24 //创建二叉树,约定使用前序遍历的方式输入数据
 25 void CreateBiThrTree(BiThrTree *T)
 26 {
 27     char c;
 28     scanf("%c", &c);
 29 
 30     if(' '==c)
 31     {
 32         *T = NULL;
 33     }
 34     else
 35     {
 36         *T = (BiThrNode *)malloc(sizeof(BiThrNode));
 37         (*T)->data = c;
 38         (*T)->ltag = Link;
 39         (*T)->rtag = Link;
 40         CreateBiThrTree(&(*T)->lchild);
 41         CreateBiThrTree(&(*T)->rchild);
 42     }
 43 }
 44 
 45 //中序遍历线索化
 46 //前驱和后继就是中序遍历的前驱和后继
 47 void InThreading(BiThrTree T)
 48 {
 49     if(T)
 50     {
 51         InThreading(T->lchild);
 52         //线索化
 53         //pre是T的前驱,T是pre的后继
 54         if(!T->lchild)
 55         {
 56             T->ltag = Thread;
 57             T->lchild = pre;
 58         }
 59         if(!pre->rchild)
 60         {
 61             pre->rtag = Thread;
 62             pre->rchild = T;
 63         }
 64         pre = T;
 65         InThreading(T->rchild);
 66     }
 67 }
 68 
 69 //添加了一个头结点p,形成一个双向链表
 70 InOrderThreading(BiThrTree *p,BiThrTree T)
 71 {
 72     *p = (BiThrNode *)malloc(sizeof(BiThrNode));
 73     (*p)->ltag = Link;
 74     (*p)->rtag = Thread;
 75     (*p)->rchild = *p;
 76     if(!T)
 77     {
 78         (*p)->lchild = *p;
 79     }
 80     else
 81     {
 82         (*p)->lchild = T;
 83         pre = *p;       //把头结点赋值给pre
 84         InThreading(T);
 85         //最终的pre是中序遍历的最后一个结点
 86         pre->rchild = *p;
 87         pre->rtag = Thread;
 88         (*p)->rchild = pre;
 89     }
 90 }
 91 
 92 //中序遍历二叉树,非递归
 93 //传进来的是头结点,不是根结点
 94 void InOrderTraverse(BiThrTree T)
 95 {
 96     BiThrTree p;
 97     p = T->lchild;
 98     while(p!=T)
 99     {
100         while(p->ltag==Link)
101         {
102             p = p->lchild;
103         }
104         printf("%c",p->data);
105         while(p->rtag==Thread && p->rchild!=T)
106         {
107             p = p->rchild;
108             printf("%c",p->data);
109         }
110         p = p->rchild;
111     }
112 }
113 
114 int main()
115 {
116     BiThrTree p,T=NULL ;
117     CreateBiThrTree(&T);
118     InOrderThreading(&p,T);
119 
120     printf("中序遍历输出结果为:");
121     InOrderTraverse(p);
122 
123     return 0;
124 }
View Code

好难啊!!!!

记不住

posted @ 2020-09-01 15:27  wind_y  阅读(200)  评论(0编辑  收藏  举报