PAT甲级的题目有关于树的题目,1053,1086,1090,1102,1106,1115,1119,1110
A1053
这题目比较简单,给定一棵树,给定一个数字,要你找到所有和等于给定数字的路径。这个题目的树没有给出是二叉树,自然不能按照原来二叉树的方法来构建了。其实就是BFS,用DFS也是可以的,不过考虑到DFS还要新开一个数组来存储路径,还是使用BFS。
首先是树的结构,只需要在原来二叉树的基础上修改一下就好了。
typedef struct treeNode {
int val;
int weight;
vector<struct treeNode *> generator;
int parent = -1;
} *TreeNode, treeNode;
把原来的左右子树修改成一个vector存储即可。树的结构中新添加了一个parent,是用于找到根节点,因为题目给出的树是一个列表,接着是树的父节点,不添加parent找不到父节点。如果parent是-1那么就是根节点了。
TreeNode createTree(int n, TreeNode *array, int allNodes) {
for (int i = 0; i < n; ++i) {
int index;
int num;
cin >> index >> num;
index_map[index] = true;
for (int j = 0; j < num; ++j) {
int next;
cin >> next;
array[next]->parent = index;
array[index]->generator.push_back(array[next]);
}
sort(array[index]->generator.rbegin(), array[index]->generator.rend(), cmp);
}
for (int k = 0; k < allNodes; ++k) {
if (array[k]->parent == -1) {
return array[k];
}
}
return nullptr;
}
创建树的过程,注意后面有一个排序操作,题目的输出要求按照次序输出。然后就是BFS操作了。
void findWeights(TreeNode root, int sum, vector<int> weightsAdd, int equalWeights) {
if (sum > equalWeights) {
return;
} else if (sum < equalWeights) {
sum += root->weight;
weightsAdd.push_back(root->weight);
if (sum == equalWeights) {
if (!index_map[root->val]) {
weights_path.push_back(weightsAdd);
weightsAdd.clear();
}
return;
}
for (int i = 0; i < root->generator.size(); ++i) {
TreeNode current = root->generator[i];
findWeights(current, sum, weightsAdd, equalWeights);
}
}
}