[[toc]]
1094 The Largest Generation
思路:利用层序遍历对每一层节点进行统计。
1 | #include <stdio.h> |
注意点:第二个测试点(只有一个根节点的情况),第三个测试点(节点为最后一个点的情况)
1079 Total Sales of Supply Chain
思路:利用DFS找到根节点的时候,计算价格即可。
1 | #include <stdio.h> |
1090 Highest Price in Supply Chain
思路:BFS找到最下面一层,并记录数量
1 | #include <stdio.h> |
注意:根节点数量为1
1106 Lowest Price in Supply Chain
思路:BFS找到根节点最低的层,并记录数量
1 | #include <cstdio> |
一次过
1004 Counting Leaves
思路:层序遍历找每一层的叶子节点
1 | #include <cstdio> |
一次过
1086 Tree Traversals Again
1 | #include <cstddef> |
注意:create函数递归的区间范围
1102 Invert a Binary Tree
思路:层序遍历与中序遍历,每次以右节点为先遍历的点
1 | #include <algorithm> |
注意:用scanf的%c输入时会识别到空格和回车,应用getchar()读入回车,或者直接使用cin即可。
1064 Complete Binary Search Tree
思路:将输入数据排序即为二叉查找树的中序遍历输出,假设已知CBT树,在中序遍历的时候加入数据,即可完成CBT树,CBT数组中存放的就是树层序输出的结果。
- 已知中序遍历和完全二叉查找树,求层序遍历。
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#include <stdio.h>
#include <algorithm>
using namespace std;
const int MAXN = 1010;
bool cmp(int a, int b){
return a < b;
}
int CBT[MAXN];
int num[MAXN];
int n;
int Index = 0;
void inOrder(int root){
if (root > n) {
return;
}
inOrder(root * 2);
CBT[root] = num[Index++];
inOrder(root * 2 + 1);
}
int main (int argc, char *argv[])
{
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", num + i);
}
sort(num, num + n, cmp);
inOrder(1);
for (int i = 1; i < n; i++) {
printf("%d ", CBT[i]);
}
printf("%d\n", CBT[n]);
return 0;
}注意
1099 Build A Binary Search Tree
思路:与上题思路一样,已知二叉树结构,和中序遍历的结果,可以在中序遍历的同时插入数据,最后层序输出结果。
1 | #include <cstdio> |
注意: root索引和root.data是不一样的值。
1066 Root of AVL Tree
思路:AVL树的常规操作,代码记住
1 | #include <cstddef> |
1107 Social Clusters
思路:将每个爱好对应第一次出现的节点,此后每出现这个爱好,就把人和此节点的根节点合并。最后统计根节点出现的次数,即为每个组的人数,后统计几个组,排序输出结果。
1 |
|
注意:isRoot函数的意义要了解清楚
1098 Insertion or Heap Sort
思路:通过插入排序前面部分有序,第一个无序后的数字与原输入数组保持一致来判断哪种排序方式。
堆排序:从后往前找到第一个小于堆顶的元素,交换,后向下调整。
插入排序:找到第一个要排序的元素,与前面元素进行比较,最终找到插入位置。
1 |
|
注意:堆排序的头节点对应a[1]非a[0]
1053 Path of Equal Weight
思路:dfs搜索即可,可以把value也作为参数,可以有效剪枝。
注意:算法笔记上的方法排序误,最后一个测试点过不了参考
1 |
|