【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 }

 

posted @ 2020-10-27 11:02  Ashlyn  阅读(113)  评论(0)    收藏  举报