服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言 二叉树的链式存储实例

C语言 二叉树的链式存储实例

2021-04-09 13:53C语言教程网 C/C++

本篇文章主要介绍C语言中二叉树的链式存储,这里提供了一个实例代码进行参考,这样对二叉树的链式存储有更深入的了解,希望能帮到学习这块知识的同学

二叉树链式存储

实现二叉树的基本操作:建立、遍历、计算深度、结点数、叶子数等。

输入C,先序创建二叉树,#表示空节点;

输入H:计算二叉树的高度;

输入L:计算二叉树的叶子个数;

输入N:计算二叉树节点总个数;

输入1:先序遍历二叉树;

输入2:中序遍历二叉树;

输入3:后续遍历二叉树;

输入F:查找值=x的节点的个数;

输入P:以缩格文本形式输出所有节点。

很简单就不需要多解释了,代码贴上

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
/*二叉树的链式存储表示*/
typedef char DataType; /*应由用户定义DataType的实际类型*/
typedef struct node
{
 DataType data;
 node *lchild, *rchild; /*左右孩子指针*/
} BinTNode;   /*结点类型*/
typedef BinTNode *BinTree;
int sum=0;
void DisplayBinTree(BinTree T); /*用格文本形式表示二叉树*/
void CreateBinTree(BinTree *T); /*构造二叉链表*/
void Preorder(BinTree T); /*前序遍历二叉树*/
void Inorder(BinTree T); /*中序遍历二叉树*/
void Postorder(BinTree T); /*后序遍历二叉树*/
int nodes(BinTree T);  /*计算总结点数*/
int leafs(BinTree T);  /*计算总叶子数*/
int hight(BinTree T);  /*计算二叉树的高度*/
int find(BinTree T,char x); //查找值=x的节点的个数;
int main()
{
 BinTree T;
 char flg;
 while(cin>>flg)
 switch(flg)
 {
 case'C':
  getchar();
  CreateBinTree(&T);
  cout<<"Created success!"<<endl;
  break;
 case'H':
  cout<<"Height="<<hight(T)<<"."<<endl;
  break;
 case'L':
  cout<<"Leaf="<<leafs(T)<<"."<<endl;
  break;
 case'N':
  cout<<"Nodes="<<nodes(T)<<"."<<endl;
  break;
 case'1':
  printf("Preorder is:");
  Preorder(T);
  cout<<"."<<endl;
  break;
 case'2':
  printf("Inorder is:");
  Inorder(T);
  cout<<"."<<endl;
  break;
 case'3':
  printf("Postorder is:");
  Postorder(T);
  cout<<"."<<endl;
  break;
 case'F':
  char x;
  int ko;
  getchar();
  cin>>x;
  ko=find(T,x);
  cout<<"The count of "<<x<<" is "<<ko<<"."<<endl;
  break;
 case'P':
  cout<<"The tree is:"<<endl;
  DisplayBinTree(T);
  break;
 default:
  cout<<"输入有误,请重新输入"<<endl;
 }
}
 
/*构造二叉链表*/
void CreateBinTree(BinTree *T)
{
 char ch;
 if ((ch=getchar())=='#')
 *T=NULL;
 else
 {
 /*读入非空格*/
 *T=(BinTNode *)malloc(sizeof(BinTNode));/*生成结点*/
 (*T)->data=ch;
 CreateBinTree(&(*T)->lchild );  /*构造左子树*/
 CreateBinTree(&(*T)->rchild );  /*构造右子树*/
 }
}
/*用缩格文本形式表示二叉树*/
void DisplayBinTree(BinTree T)
{
 BinTree stack[100],p;
 int level[100],top,n,i;
 if (T)
 {
 top=1;
 stack[top]=T;
 level[top]=0;
 while(top>0)
 {
  p=stack[top];
  n=level[top];
  for (i=1; i<=n; i++)
  cout<<" ";
  printf("%c\n",p->data);
  top--;
  if (p->rchild!=NULL)
  {
  top++;
  stack[top]=p->rchild;
  level[top]=n+2;
  }
  if (p->lchild!=NULL)
  {
  top++;
  stack[top]=p->lchild;
  level[top]=n+2;
  }
 }
 }
}
/*计算总结点数*/
int nodes(BinTree T)
{
 if(T)
 {
 if( (T->lchild==NULL)&&(T->rchild==NULL))
  return 1;
 else
  return nodes(T->lchild)+nodes(T->rchild)+1;
 }
 return 0;
}
/*计算总叶子数*/
int leafs(BinTree T)
{
 if(T)
 {
 if ((T->lchild==NULL)&&(T->rchild==NULL))
  return 1;
 else
  return leafs(T->lchild)+leafs(T->rchild);
 }
 return 0;
}
/*计算树的高度*/
int hight(BinTree T)
{
 if(T)
 {
 if ((T->lchild==NULL)&&(T->rchild==NULL))
  return 1;
 
 else if((T->lchild==NULL)&&(T->rchild))
  return 1+hight(T->rchild);
 
 else if((T->lchild)&&(T->rchild==NULL))
  return 1+hight(T->lchild);
 
 else
  return hight(T->lchild)+hight(T->rchild);
 }
 return 0;
}
/*前序遍历二叉树*/
void Preorder(BinTree T)
{
 if(T)
 {
 printf("%c ",T->data); /*访问结点*/
 Preorder(T->lchild);
 Preorder(T->rchild);
 }
}
/*中序遍历二叉树*/
void Inorder(BinTree T)
{
 if(T)
 {
 Inorder(T->lchild);
 printf("%C ",T->data);
 Inorder(T->rchild);
 }
}
/*后序遍历二叉树*/
void Postorder(BinTree T)
{
 if(T)
 {
 Postorder(T->lchild);
 Postorder(T->rchild);
 printf("%C ",T->data);
 }
}
int find(BinTree T,char x)
{
 if(T)
 {
 if((T->data)==x)
  sum++;
 find(T->lchild,x);
 find(T->rchild,x);
 
 }
 return sum;
}

以上就是二叉树链式存储的一个小实例,需学习要的同学请参考,谢谢支持

延伸 · 阅读

精彩推荐