复习树的表示-双亲表示法

  1. 给定一个二叉树(双亲表示法)和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

代码:

/*
	树的表示-双亲表示法 
*/
#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");
			}
		} 
	} 
}

运行结果:
在这里插入图片描述

++++++++++++++++++++++++++++++++++++分割线+++++++++++++++++++++++++++++++++++

更一个

  1. 祖父结点值为偶数的结点和

代码:

/*
	树的表示-双亲表示法 
*/
#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'
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值