二叉树的最短路径长度(BFS+DFS)

二叉树的最短路径长度

已解决

查看题解查看答案

题目描述

Time Limit: 1000 ms

Memory Limit: 256 mb

对二叉树,计算任意两个结点的最短路径长度。

输入输出格式
输入描述:

第一行输入测试数据组数 T 第二行输入 n , m 。 n 代表输入的数据组数, m 代表要查询的数据组数。 接下来 n 行,每行输入两个数,代表1~ n 结点的孩子结点,如果没有孩子结点则输入-1,根节点为1。 接下来 m 行,每行输入两个数,代表要查询的两个结点。

输出描述:

每组测试数据输出 m 行,代表查询的两个结点之间的最短路径长度。

输入输出样例
输入样例#:

复制

复制代码
1
8 4
2 3
4 5
6 -1
-1 -1
-1 7
-1 -1
8 -1
-1 -1
1 6
4 6
4 5
8 1
输出样例#:

复制

复制代码
2
4
2
4
题目来源
复制代码
北京邮电大学机试题
复制代码
#include<bits/stdc++.h>
using namespace std;

//10000容易超时 
#define N 100005

int lch[N], rch[N];//i节点的左右孩子 
int parent[N];//i节点的最严厉的父亲
int depth[N];//i节点的深度 

void DFS(int u){
	if(lch[u] != -1){//节点不为空 
		depth[lch[u]] = depth[u] + 1;//等于它父亲的高度+1 
		DFS(lch[u]); 
	}
	
	if(rch[u] != -1){
		depth[rch[u]] = depth[u] + 1;
		DFS(rch[u]); 
	}
}

int getDist(int u, int v){
	int count = 0;
	
	while(depth[u] > depth[v]){//如果u更深就往上爬 
		u = parent[u];
		count ++;
	}
	
	while(depth[v] > depth[u]){//如果v更深就往上爬 
		v = parent[v];
		count ++;
	}
	
	while(u != v){//同时网上爬 
		u = parent[u];
		v = parent[v];
		count += 2;
	}
	
	return count;
	
}


int main(){
	ios_base::sync_with_stdio(false);
    cin.tie(NULL);
	int t;
	cin>>t;
	while(t--){
		int n, m;
		cin>>n>>m;
		
		for(int i = 0; i <= n; i ++){//全部初始化 , 包括0, 否则会污染数据, 无法通过
			lch[i] = rch[i] = -1;
			parent[i] = 0;
			depth[i] = 0;
		}
		
		for(int i = 1; i <= n; i ++){//先输入节点 
			cin>>lch[i]>>rch[i];
		}
		
		for(int i = 1; i <= n; i ++){//认爹大法 
			if(lch[i] != -1){//左孩子不是空
				parent[lch[i]] = i;//认爹 
			} 
			if(rch[i] != -1){//右孩子不是空 
				parent[rch[i]] = i;//认爹 
			}
		}
		
		depth[1] = 0;//根节点高度为0
//		DFS(1);//深度遍历 
		queue<int>q;
		q.push(1);//根节点入队
		
		while(!q.empty()){//BFS遍历深度 
			int i = q.front();
			q.pop();
			
			if(lch[i] != -1){//有左孩子
				depth[lch[i]] = depth[i] + 1;
				
				q.push(lch[i]);//左孩子进去
			}
			
			if(rch[i] != -1){
				depth[rch[i]] = depth[i] + 1;
				
				q.push(rch[i]);
			}
			
		} 
		
		while(m --){
			int u, v;
			cin>>u>>v;
			cout<<getDist(u, v)<<'\n';
		}
		
		
		
	}
	
	

	
	
	
	
}
相关推荐
x138702859571 天前
c语言中srtlen(指针使用计算字符长度)、传值和传址调用
c语言·开发语言·算法·visual studio
海兰1 天前
【实用程序】电商销售分析仪表盘 — 从零搭建一个AI参与的全栈数据洞察系统
人工智能·学习·算法
zwenqiyu1 天前
P5283 [十二省联考 2019] 异或粽子题解
c++·学习·算法
wayz111 天前
Momentum:TSI(真实强度指数)技术指标详解
算法·金融·数据分析·量化交易·特征工程
万事大吉CC1 天前
Python 笔试输入模板总结
python·算法
lihao lihao1 天前
Linux信号
开发语言·c++·算法
大白话_NOI1 天前
【洛谷 P2249】查找(深基 13. 例 1)+ 详细分析
c++·算法
吠品1 天前
C++实现m行n列带边框的长方形输出
算法
智者知已应修善业1 天前
【51单片机2个外部中断显示中断历时,初始化8左移3位共阳数码管】2024-6-6
c++·经验分享·笔记·算法·51单片机
西安邮电大学1 天前
分治算法详细讲解
java·后端·其他·算法·面试