【PTA】二叉树相关操作
1. 二叉树的创建和三种遍历
思路:
本质上结构体用的是双向链表,left指左孩子,right指右孩子,递归读入数据
先根遍历,中根遍历和后根遍历也是同样的想法,只要注意顺序问题就没问题了(
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n; 4 typedef struct NODE { 5 int data; 6 struct NODE* left; 7 struct NODE* right; 8 }node, *link; 9 10 void create(link &head) 11 { 12 cin>>n; 13 getchar(); 14 if ( n == 0 ) 15 { 16 head = NULL; 17 return; 18 } 19 else 20 { 21 head = (link)malloc(sizeof(node)); 22 head->data = n; 23 create(head->left); 24 create(head->right); 25 } 26 27 28 } 29 30 void preT(link h) 31 { 32 if (h) 33 { 34 printf("%d ",h->data); 35 preT(h->left); 36 preT(h->right); 37 } 38 } 39 40 void midT(link h) 41 { 42 if (h) 43 { 44 midT(h->left); 45 printf("%d ",h->data); 46 midT(h->right); 47 } 48 } 49 50 void postT(link h) 51 { 52 if (h) 53 { 54 postT(h->left); 55 postT(h->right); 56 printf("%d ",h->data); 57 } 58 } 59 int main() 60 { 61 link t; 62 create(t); 63 preT(t); 64 printf("\n"); 65 midT(t); 66 printf("\n"); 67 postT(t); 68 69 return 0; 70 }
2. 二叉树查找节点及父节点
思路:
我写的其实有一点麻烦了,因为不涉及到删除之类的操作,所以我在创建二叉树的时候就用一个数组来存储已加入的数据,在查找父节点之前先判断这个元素是否在树里以及是否是根节点,然后再调用find函数来找父节点
代码:
1 #include<stdio.h> 2 #include <stdlib.h> 3 4 typedef struct NODE { 5 int data; 6 struct NODE* left; 7 struct NODE* right; 8 }node, *link; 9 10 int cnt; 11 int num[200000]; //存储二叉树元素 12 13 void create(link &t) 14 { 15 int n; 16 scanf("%d",&n); 17 getchar(); 18 if (n == 0) 19 { 20 t = NULL; 21 return; 22 } 23 else 24 { 25 t = (link)malloc(sizeof(node)); 26 t->data = n; 27 num[cnt] = n; 28 cnt++; 29 create(t->left); 30 create(t->right); 31 } 32 } 33 34 void find(link t, int k) 35 { 36 if (t == NULL) 37 return; 38 if ((t->left != NULL && t->left->data == k )|| (t->right != NULL && t->right->data == k)) 39 { 40 printf("%d\n",t->data); 41 return; 42 }
43 find(t->left, k); //要判断左右孩子是否为空,不然会出现段错误 44 45 find(t->right, k); 46 47 } 48 49 50 51 int jud(int k) 52 { 53 for (int i = 0; i < cnt; i++) 54 { 55 if (num[i] == k) 56 return 1; 57 } 58 return 0; 59 } 60 61 int main() 62 { 63 link tree; 64 create(tree); 65 int m; 66 scanf("%d",&m); 67 for (int i = 0; i < m; i++) 68 { 69 int k; 70 scanf("%d",&k); 71 if (jud(k)) 72 { 73 if (tree->data == k) 74 printf("0\n"); 75 else 76 find(tree, k); 77 } 78 else 79 printf("0\n"); 80 } 81 return 0; 82 }
3. 二叉树删除子树
思路:
就单纯的把找到的节点置空。
一开始写的时候脑子突然短路,还判断了个左孩子右孩子是否为所找节点,然后什么操作也不做接着递归(...)
也要注意判断左右孩子是否为空,否则会一直段错误
代码:
1 #include<stdio.h> 2 #include <stdlib.h> 3 4 typedef struct NODE { 5 int data; 6 struct NODE* left; 7 struct NODE* right; 8 }node, *link; 9 10 int jud; 11 12 void create(link &t) 13 { 14 int n; 15 scanf("%d",&n); 16 getchar(); 17 if (n == 0) 18 { 19 t = NULL; 20 return; 21 } 22 else 23 { 24 t = (link)malloc(sizeof(node)); 25 t->data = n; 26 create(t->left); 27 create(t->right); 28 } 29 } 30 31 void del(link &t, int k) 32 { 33 if (t == NULL) 34 return; 35 if (t->data == k) 36 { 37 t = NULL; 38 return; 39 } 40 if (t->left != NULL) 41 del(t->left, k); 42 if (t->right != NULL) 43 del(t->right, k); 44 } 45 46 void ok(link t, int k) 47 { 48 if (t == NULL ) 49 return; 50 if (t->data == k) 51 { 52 jud = 1; 53 return; 54 } 55 56 if (t->left != NULL) 57 ok(t->left, k); 58 if (t->right != NULL) 59 ok(t->right, k); 60 } 61 62 63 void pri(link t) 64 { 65 if (t) 66 { 67 pri(t->left); 68 printf("%d ",t->data); 69 pri(t->right); 70 } 71 } 72 73 int main() 74 { 75 link tree; 76 create(tree); 77 int m; 78 scanf("%d",&m); 79 for (int i = 0; i < m; i++) 80 { 81 int k; 82 scanf("%d",&k); 83 ok(tree, k); 84 if (jud) 85 { 86 del(tree, k); 87 pri(tree); 88 printf("\n"); 89 } 90 else 91 printf("0\n"); 92 jud = 0; 93 } 94 }

浙公网安备 33010602011771号