找出直系亲属【浙江大学】★

本文介绍了一种使用二叉树存储亲子关系的方法,并通过深度优先搜索(DFS)算法来查找两个节点之间的关系。代码实现了输入亲子关系和查询关系的功能,能够判断查询的两个节点是否为父子、祖孙或更远的亲属关系。

题目链接

解题思路

使用二叉树存亲子关系,然后通过深搜查找
可以多做几遍

#include<bits/stdc++.h>
using namespace std;
vector<int> G[30];
int opt;
void dfs(int s, int e, int step){
	if(s == e) {
		opt=step;
		return;
	}
	for(int j=0; j<G[s].size(); j++){
		int v = G[s][j];
		dfs(v, e, step+1);
	}
}
int main(){
	int m,n; 
	while(cin>>n>>m){
		char a,b,c;
		for(int i=0;i<30;i++){
			G[i].clear();
		}
		for(int i=0;i<n;i++){
			cin>>a>>b>>c;
			G[a-'A'].push_back(b-'A');
			G[a-'A'].push_back(c-'A');
		}
		for(int i=0;i<m;i++){
			cin>>a>>b;
			opt = -1;
			dfs(a-'A', b-'A', 0); 
			int p1 = opt;
			opt = -1;
			dfs(b-'A', a-'A', 0); 
			int p2 = opt;
			if(p1==-1 && p2==-1) cout<<"-"<<endl;
			else{
				int t= max(p1, p2);
				for(int i=t-1;i>=0;i--){
					if(i==0){
						
						if(t==p1) cout<<"child";
						else cout<<"parent";
					}
					else if(i==1) cout<<"grand";
					else cout<<"great-";
				}
				cout<<endl;
			}
		}
	}
	
	
	return 0;
}
### 浙江大学秋季学期数据结构课程相关习题 #### 的同构 在PAT甲级考试中,Tree Traversals Again是一道考察的遍历以及的同构判断的经典题目。这道题要求考生能够熟练掌握前序、中序和后序三种遍历方式,并能通过给定的部分遍历序列推断出另一部分遍历的结果,进而比较两棵是否同构[^1]。 ```cpp bool Isomorphic(BinTree T1, BinTree T2){ if (!T1 && !T2) return true; if ( (!T1&&T2) || (T1&&!T2)) return false; bool res = false; if(T1->Data == T2->Data) res = (Isomorphic(T1->Left,T2->Left)&&Isomorphic(T1->Right,T2->Right)) ||(Isomorphic(T1->Left,T2->Right)&&Isomorphic(T1->Right,T2->Left)); return res; } ``` 此代码片段展示了如何递归地检查两个二叉是否为同构的关系。当遇到相同的数据节点时,不仅需要考虑左右子保持一致的情况,还需要考虑到一种特殊情况——即一棵交换其所有分支后的形态与另一棵相匹配的情形。 #### AVL的基础操作 浙大计算机学院曾经在其免试研究生入学测试中设置了有关AVL的问题。这类问题通常围绕着平衡因子调整展开,旨在检验学生对自平衡二叉查找的理解程度及其编程实现能力[^2]。 ```cpp int GetHeight(Position P){ if(!P) return 0; else{ int HL = GetHeight(P->Left); int HR = GetHeight(P->Right); return ((HL>HR)?HL:HR)+1; } } void Insert_AVL(BinTree &BT, ElementType X){ // 插入过程省略... UpdateBalanceFactor(BT); // 更新各节点的高度差(平衡因子) BalanceAVL(BT,X); // 如果失衡,则旋转恢复平衡状态 } ``` 上述伪码描述了一个简化版的AVL插入算法框架,其中包含了获取高度函数`GetHeight()`用于计算任意节点的最大深度,而`Insert_AVL()`负责执行实际的元素插入动作并调用辅助方法来维护整棵AVL处于平衡状态。 #### 完全二叉特性应用 针对完全二叉的特点,在某些情况下可以采用数组形式来进行紧凑表示,从而节省内存开销。具体来说就是利用数组索引来表达父子间的位置关系:对于编号为i的父亲节点而言,它的左儿子位于位置2*i处,右儿子则处在2*i+1位;反之亦然,非根节点p的父亲总是存在于floor(p/2)之处[^3]。 ```cpp // 假设有一个大小为N的一维数组array[]用来保存完全二叉中的各个节点值, // 则可以通过简单的算术运算访问对应的子女或祖先。 ElementType Parent(int index){return array[index / 2];} // 获取父节点 ElementType LeftChild(int index){if(index*2<=N)return array[index * 2];else return NULL;} // 左孩子 ElementType RightChild(int index){if((index*2+1)<=N)return array[index * 2 + 1];else return NULL;} // 右孩子 ``` 这段C++风格的例子说明了怎样基于一维数组快速定位到目标节点的直系亲属成员,适用于处理那些具有固定规模且接近满载的理想化场景下的二叉实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值