-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path10号二叉树.cpp
170 lines (167 loc) · 4.38 KB
/
10号二叉树.cpp
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
// (1)按屏幕提示用前序方法建立一棵二叉树,并能按凹入法显二叉树结构。
// (2)编写前序遍历、中序遍历、后序遍历,层次遍历程序。
// (3)编写求二叉树的叶结点数,总结点数和深度和程序。
// (4)设计一个选择式菜单,以菜单方式选择下列操作。
// 二 叉 树 子系 统
// ***********************************
// * 1----建 二 叉 树 *
// * 2----凹 入 显 示 *
// * 3----先 序 遍 历 *
// * 4----中 序 遍 历 *
// * 5----后 序 遍 历 *
// * 6----层 次 遍 历 *
// * 7----求 叶 子 数 *
// * 8----求 结 点 数 *
// * 9----求 树 深 度 *
// * 0----返 回 *
// ***********************************
#include <iostream>
#include <malloc.h>
#include<queue>
using namespace std;
char ch;
int m, n;
typedef struct BiTNode {
char data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
//前序遍历建立二叉链表
void InitBiTree(BiTree& T) {
cin >> ch;
if (ch == '#')
T = NULL;
else {
T = new BiTNode;
T->data = ch;
InitBiTree(T->lchild);
InitBiTree(T->rchild);
}
}
//遍历二叉树
void TraverseBiTree(BiTree T, int number) {
if (T) {
if (number == 0) cout << T->data << " ";//先序遍历
TraverseBiTree(T->lchild, number);
if (number == 1) cout << T->data << " ";//中序遍历
TraverseBiTree(T->rchild, number);
if (number == 2) cout << T->data << " ";//后序遍历
}
}
//节点数
int NodeCout(BiTree T) {
if (T)
return NodeCout(T->lchild) + NodeCout(T->rchild) + 1;
else
return 0;
}
//叶子节点数
int LeafNodeCout(BiTree T) {
if (T) {
if (T->lchild or T->rchild) {
return LeafNodeCout(T->lchild) + LeafNodeCout(T->rchild);
}
else
return 1;
}
else
return 0;
}
//凹入显示;
void Dent(BiTree T, int depth) {
int i;
if (T) {
for (i = 0; i < depth; i++) {
cout << T->data;
}
cout << endl;
Dent(T->lchild, depth - 1);
Dent(T->rchild, depth - 1);
}
}
//层次遍历
void LevelOrderTraverse(BiTree T) {
BiTree p = T;
queue<BiTree> Q;
Q.push(p);
while (!Q.empty())
{
p = Q.front();
Q.pop();
cout << p->data << " ";
if (p->lchild != NULL)
Q.push(p->lchild);
if (p->rchild != NULL)
Q.push(p->rchild);
}
}
//二叉树深度
int Depth(BiTree T) {
if (T) {
m = Depth(T->lchild);
n = Depth(T->rchild);
return m > n ? m + 1 : n + 1;
}
else
return 0;
}
//功能展示
void ShowFuntion() {
cout << "\t\t\t\t二 叉 树 子 系 统" << endl;
cout << "***************************************************************************" << endl;
cout << "1.建二叉树\t2.凹入显示\t3.先序遍历\t4.中序遍历\t5.后序遍历" << endl;
cout << "6.层次遍历\t7.求叶子数\t8.求节点数\t9.求树深度\t0.返 回" << endl;
cout << "***************************************************************************" << endl;
cout << "请选择相应的功能序号:";
}
int main() {
int j;
BiTree Tree=NULL;
while (true) {
ShowFuntion();
cin >> j;
cout << endl;
switch (j) {
case 1:
cout<<"前序遍历建立二叉树,以'#'表示空:"<<endl;
InitBiTree(Tree);
break;
case 2:
cout<<"凹入显示"<<endl;
Dent(Tree, Depth(Tree));
break;
case 3:
cout << endl << "先序遍历:";
TraverseBiTree(Tree, 0);
cout<<endl;
break;
case 4:
cout << endl << "中序遍历:";
TraverseBiTree(Tree, 1);
cout<<endl;
break;
case 5:
cout << endl << "后序遍历:";
TraverseBiTree(Tree, 2);
cout<<endl;
break;
case 6:
cout << "层次遍历" ;
LevelOrderTraverse(Tree);
cout<<endl;
break;
case 7:
cout << "叶子节点数:";
cout<<LeafNodeCout(Tree)<<endl;
break;
case 8:
cout << "节点数:";
cout<<NodeCout(Tree)<<endl;
break;
case 9:
cout << "二叉树深度:";
cout<<Depth(Tree)<<endl;
break;
case 0:return 0;
}
}
}