更
- 给定一个二叉树(双亲表示法)和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
代码:
/*
树的表示-双亲表示法
*/
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 105
// 树的结点
struct PTNode {
char data;
int parent;
};
// 树
struct PTree {
struct PTNode node[MAX_SIZE];
int n;// 结点个数
};
void findSpecPath(struct PTree tree, int tar);
int main() {
struct PTree tree;
struct PTNode p;// 工作指针
int i = 0;
char nodes[MAX_SIZE] = "";
scanf("%d", &tree.n);
tree.node[0].data = '6', tree.node[0].parent = -1;
tree.node[1].data = '3', tree.node[1].parent = 0;
tree.node[2].data = '1', tree.node[2].parent = 1;
tree.node[3].data = '3', tree.node[3].parent = 2;
tree.node[4].data = '7', tree.node[4].parent = 0;
tree.node[5].data = '2', tree.node[5].parent = 0;
tree.node[6].data = '5', tree.node[6].parent = 5;
tree.node[7].data = '7', tree.node[7].parent = 5;
printf("树中所有结点为:\n");
for (i = 0; i < tree.n; i++) {
printf("%c ", tree.node[i].data);
}
printf("\n");
printf("所有根结点到叶子结点值之和为13的路径为:\n");
findSpecPath(tree, 13);
return 0;
}
// 给定一个二叉树和一个目标和,找到所有从根节点到叶子
// 节点路径总和等于给定目标和的路径。
// 算法概述:统计每个叶子结点到根节点的结点值之和,等于
// 目标和的时候逆序输出这些结点值
void findSpecPath(struct PTree tree, int tar) {
int sum = 0;
int flag = 0;
int i = 0, j = 0, k = 0;
struct PTNode p;// 工作结点
char node[MAX_SIZE] = {
0};
for (i = 0; i < tree.n; i++) {
j = 0, flag = 1;
while (j < tree.n) {
if (tree.node[j++].parent == i)
flag = 0;// 标记为非叶子结点
}
if (flag) {
j = 0;
p = tree.node[i];
sum = p.data - '0';
node[j++] = p.data;
while (p.parent != -1) {
// 统计结点值之和
p = tree.node[p.parent];
sum += (p.data - '0');
node[j++] = p.data;
}
node[j] = '\0';
if (sum == tar) {
for (k = j - 1; k >= 0; k--)
printf("%c ", node[k]);
printf("\n");
}
}
}
}
运行结果:
++++++++++++++++++++++++++++++++++++分割线+++++++++++++++++++++++++++++++++++
更一个
- 祖父结点值为偶数的结点和
代码:
/*
树的表示-双亲表示法
*/
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 105
// 树的结点
struct PTNode {
char data;
int parent;
};
// 树
struct PTree {
struct PTNode node[MAX_SIZE];
int n;// 结点个数
};
int getLeavesCount(struct PTree tree);
void getDataAndLayer(struct PTree tree);
void getNearestPaNode(struct PTree tree, int nodeIndex1, int nodeIndex2);
int getLowestLeavesCount(struct PTree tree);
int getDegreeAndSpeNodes(struct PTree tree, char nodes[]);
int getOneChiNodeAmt(struct PTree tree);
int graFaEvNoSum(struct PTree tree);
int main() {
struct PTree tree;
struct PTNode p;// 工作指针
int i = 0;
char nodes[MAX_SIZE] = "";
scanf("%d", &tree.n);
tree.node[0].data = '6', tree.node[0].parent = -1;
tree.node[1].data = '8', tree.node[1].parent = 0;
tree.node[2].data = '9', tree.node[2].parent = 1;
tree.node[3].data = '3', tree.node[3].parent = 2;
tree.node[4].data = '1', tree.node[4].parent = 0;
tree.node[5].data = '2', tree.node[5].parent = 0;
tree.node[6].data = '5'