数据结构实验5——二叉树
学校给了代码让填空…………非常简单
1 #include <iostream> 2 #include <cstdio> 3 #include <cwchar> 4 #include <windows.h> 5 using namespace std; 6 #define ok 1 7 #define error 0 8 9 //二叉链表定义 10 typedef struct BiNode 11 { 12 char data; 13 struct BiNode *lchild,*rchild; 14 }BiTNode,*BiTree; 15 16 typedef BiTree QElemType; 17 //链队列的定义 18 typedef struct QNode 19 { 20 QElemType data; 21 QNode *next; 22 }*QueuePtr; 23 24 typedef struct 25 { 26 QueuePtr front,rear;// 队头、队尾指针 27 28 }LinkQueue; 29 30 //初始化队列 31 int InitQueue(LinkQueue &Q) 32 { // 构造一个空队列Q 33 Q.front = Q.rear = new QNode; 34 Q.front->next = nullptr; 35 return ok; 36 } 37 //入队 38 int EnQueue(LinkQueue &Q,QElemType e) 39 { // 插入元素e为Q的新的队尾元素 40 auto p = new QNode; 41 p->data = e; 42 p->next = nullptr; 43 Q.rear->next = p; 44 Q.rear = p; 45 return ok; 46 } 47 //判断队空 48 int QueueEmpty(LinkQueue Q) 49 { // 若Q为空队列,则返回TRUE,否则返回FALSE 50 if(Q.front->next==nullptr) 51 return ok; 52 else 53 return error; 54 } 55 //出队 56 int DeQueue(LinkQueue &Q,QElemType &e) 57 { // 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR 58 if(Q.front->next != nullptr){ 59 e = Q.front->data; 60 Q.front = Q.front->next; 61 return ok; 62 } 63 else 64 return error; 65 } 66 67 void InitBiTree(BiTree &T) 68 { // 操作结果:构造空二叉树T 69 T=nullptr; 70 } 71 72 int BiTreeEmpty(BiTree T) 73 { // 初始条件:二叉树T存在。操作结果:若T为空二叉树,则返回TRUE,否则FALSE 74 if(T) 75 return error; 76 else 77 return ok; 78 } 79 80 void DestroyBiTree(BiTree T) 81 { // 初始条件:二叉树T存在。操作结果:销毁二叉树T 82 if(T) // 非空树 83 { 84 if(T->lchild) // 有左孩子 85 DestroyBiTree(T->lchild); // 销毁左孩子子树 86 if(T->rchild) // 有右孩子 87 DestroyBiTree(T->rchild); // 销毁右孩子子树 88 free(T); // 释放根结点 89 T=nullptr; // 空指针赋0 90 } 91 } 92 93 94 BiTree Point(BiTree T, char s) 95 { // 返回二叉树T中指向元素值为s的结点的指针。另加 96 LinkQueue q; 97 BiTree a; 98 99 if(T) // 非空树 100 { 101 InitQueue(q); // 初始化队列 102 EnQueue(q,T); // 根指针入队 103 while(!QueueEmpty(q)) // 队不空 104 { 105 DeQueue(q,a); // 出队,队列元素赋给a 106 if(a->data==s) 107 return a; 108 if(a->lchild) // 有左孩子 109 EnQueue(q,a->lchild); // 入队左孩子 110 if(a->rchild) // 有右孩子 111 EnQueue(q,a->rchild); // 入队右孩子 112 } 113 } 114 // cout<<a->data<<endl; 115 return nullptr; 116 } 117 118 void Assign(BiTree p, char value) 119 { // 给p所指结点赋值为value 120 p->data=value; 121 } 122 123 char LeftChild(BiTree T, char e) 124 { // 初始条件:二叉树T存在,e是T中某个结点。操作结果:返回e的左孩子。若e无左孩子,则返回"空" 125 BiTree a; 126 if(T) // 非空树 127 { 128 a=Point(T,e); // a是结点e的指针 129 if(a&&a->lchild) // T中存在结点e且e存在左孩子 130 return a->lchild->data; // 返回e的左孩子的值 131 } 132 return ' '; // 其余情况返回空 133 } 134 135 char RightChild(BiTree T, char e) 136 { // 初始条件:二叉树T存在,e是T中某个结点。操作结果:返回e的右孩子。若e无右孩子,则返回"空" 137 BiTree a; 138 if(T) // 非空树 139 { 140 a=Point(T,e); // a是结点e的指针 141 if(a&&a->rchild) // T中存在结点e且e存在右孩子 142 return a->rchild->data; // 返回e的右孩子的值 143 } 144 return ' '; // 其余情况返回空 145 } 146 147 148 149 char Parent(BiTree T, char e) 150 { // 初始条件:二叉树T存在,e是T中某个结点 151 // 操作结果:若e是T的非根结点,则返回它的双亲,否则返回"空" 152 LinkQueue q; 153 QElemType a; //BiTree a; 154 if(T) // 非空树 155 { 156 InitQueue(q); // 初始化队列 157 EnQueue(q,T); // 树根指针入队 158 while(!QueueEmpty(q)) // 队不空 159 { 160 DeQueue(q,a); // 出队,队列元素赋给a 161 if(a->lchild&&a->lchild->data==e||a->rchild&&a->rchild->data==e) // 找到e(是其左或右孩子) 162 return a->data; // 返回e的双亲的值 163 else // 没找到e,则入队其左右孩子指针(如果非空) 164 { 165 if(a->lchild) 166 EnQueue(q,a->lchild); 167 if(a->rchild) 168 EnQueue(q,a->rchild); 169 } 170 } 171 } 172 return ' '; // 树空或没找到e 173 } 174 175 //用算法5.3 先序遍历的顺序建立二叉链表 176 void CreateBiTree(BiTree &T) 177 { 178 //按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T 179 char ch; 180 cin>>ch; 181 if(ch=='#') T=nullptr; //递归结束,建空树 182 else 183 { 184 T = new BiTNode; 185 T->data = ch; 186 CreateBiTree(T->lchild); 187 CreateBiTree(T->rchild); 188 } 189 } //CreateBiTree 190 191 void InOrderTraverse(BiTree T) 192 { 193 //中序遍历二叉树T的递归算法 194 if(T){ 195 InOrderTraverse(T->lchild); 196 cout<<T->data; 197 InOrderTraverse(T->rchild); 198 } 199 } 200 201 void PreOrderTraverse(BiTree T) 202 { 203 //先序遍历二叉树T的递归算法 204 if(T){ 205 cout<<T->data; 206 InOrderTraverse(T->lchild); 207 InOrderTraverse(T->rchild); 208 } 209 } 210 211 void PostOrderTraverse(BiTree T) 212 { 213 //后序遍历二叉树T的递归算法 214 if(T){ 215 InOrderTraverse(T->lchild); 216 InOrderTraverse(T->rchild); 217 cout<<T->data; 218 } 219 } 220 221 222 int BiTreeDepth(BiTree T) 223 { 224 int m,n; 225 if(T == nullptr ) return 0; //如果是空树,深度为0,递归结束 226 else 227 { 228 m = BiTreeDepth(T->lchild); 229 n = BiTreeDepth(T->rchild); 230 if(m > n) return m + 1; 231 else return n + 1; 232 233 } 234 } 235 236 int LeadCount(BiTree T) 237 {//求叶子数 238 if(T->rchild || T->lchild) return 0; 239 else return LeadCount(T->lchild) + 1 + LeadCount(T->rchild); 240 } 241 242 int NodeCount(BiTree T) 243 {//求结点数 244 if(T == nullptr) return 0; 245 else return NodeCount(T->lchild) + 1 + NodeCount(T->rchild); 246 } 247 248 249 char Root(BiTree T) 250 {//返回根结点值 251 if(T) 252 return T->data; 253 else return ' '; 254 } 255 256 int main() 257 { 258 BiTree T,p; 259 char e1,e2; 260 int islelect; 261 SetConsoleOutputCP(65001); 262 InitBiTree(T); 263 cout<<"------------------------------------------------------\n"; 264 printf("构造空二叉树后,树空否?%d(1:是 0:否)\n树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T)); 265 e1=Root(T); 266 if(e1!=' ') 267 printf("二叉树的根为: %c\n",e1); 268 else 269 printf("树空,无根\n"); 270 cout<<"------------------------------------------------------\n"; 271 272 printf("请先序输入二叉树(P121图5.10(b): ABC##DE#G##F###)\n"); 273 CreateBiTree(T); 274 printf("建立二叉树后,树空否?%d(1:是 0:否)",BiTreeEmpty(T)); 275 276 e1=Root(T); 277 if(e1!=' ') 278 printf("二叉树的根为: %c\n",e1); 279 else 280 printf("树空,无根\n"); 281 cout<<"------------------------------------------------------\n"; 282 cout<<" 树的叶子数="<<LeadCount(T)<<endl; 283 cout<<" 树的结点数="<<NodeCount(T)<<endl; 284 cout<<" 树的叶深度="<<BiTreeDepth(T)<<endl; 285 286 printf("\n先序递归遍历二叉树:\n"); 287 PreOrderTraverse(T); 288 printf("\n中序递归遍历二叉树:\n"); 289 InOrderTraverse(T); 290 printf("\n后序递归遍历二叉树:\n"); 291 PostOrderTraverse(T); 292 cout<<"\n------------------------------------------------------\n"; 293 294 printf("\n请输入一个结点的值: "); 295 cin>>e1; 296 // cout<<e1; 297 p=Point(T,e1); // p为e1的指针 298 if(p) 299 printf("结点的值为%c\n",p->data); 300 else 301 cout<<"输入结点值错误!\n"; 302 cout<<"\n------------------------------------------------------\n"; 303 304 printf("欲改变此结点的值,请输入新值: "); 305 cin>>e2; 306 Assign(p,e2); 307 cout<<"\n------------------------------------------------------\n"; 308 printf("\n先序递归遍历二叉树:\n"); 309 PreOrderTraverse(T); 310 printf("\n中序递归遍历二叉树:\n"); 311 InOrderTraverse(T); 312 printf("\n后序递归遍历二叉树:\n"); 313 PostOrderTraverse(T); 314 cout<<"\n------------------------------------------------------\n"; 315 316 e1=Parent(T,e2); 317 if(e1!=' ') 318 printf("\n%c的双亲是%c",e2,e1); 319 else 320 printf("\n%c没有双亲\n",e2); 321 322 e1=LeftChild(T,e2); 323 if(e1!=' ') 324 printf("\n%c的左孩子是%c\n",e2,e1); 325 else 326 printf("\n%c没有左孩子\n",e2); 327 328 e1=RightChild(T,e2); 329 if(e1!=' ') 330 printf("\n%c的右孩子是%c\n",e2,e1); 331 else 332 printf("\n%c没有右孩子\n",e2); 333 cout<<"\n------------------------------------------------------\n"; 334 335 DestroyBiTree(T); 336 system("pause"); 337 return 0; 338 }
一以贯之的努力 不得懈怠的人生 每天的微小积累会决定最终结果 ————————裴之
欢迎加我QQ:1136244161一起讨论,共同进步