返回
Java&C++编程复习:链式前向星解leetcode310最小高度树
后端
2023-11-01 06:31:56
前言
大家好,我是技术博客创作专家,今天我将与大家分享一篇关于Java&C++编程复习的文章,题目是leetcode310.最小高度树,使用链式前向星数据结构进行求解。
正文
leetcode310.最小高度树
leetcode310.最小高度树是一道经典的图论题目,题目如下:
给定一个无向图,找到该图的最小高度树。
最小高度树的定义
最小高度树是指一棵树,从树的根节点到任何一个叶子节点的最长路径长度是最短的。
链式前向星数据结构
链式前向星数据结构是一种存储图信息的常见数据结构,它使用数组和链表来存储图中的边。链式前向星数据结构的特点是空间复杂度低,查询效率高,非常适合存储稀疏图。
Java代码
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Solution {
public TreeNode findMinHeightTree(int n, int[][] edges) {
// 创建图
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i < n; i++) {
graph.add(new ArrayList<>());
}
for (int[] edge : edges) {
int u = edge[0], v = edge[1];
graph.get(u).add(v);
graph.get(v).add(u);
}
// 找到图的直径
int[] diameter = findDiameter(graph);
int start = diameter[0], end = diameter[1];
// 找到从start到end的最长路径
int[] path = findLongestPath(graph, start, end);
int root = path[0];
// 返回根节点
return new TreeNode(root);
}
private int[] findDiameter(List<List<Integer>> graph) {
// 广度优先搜索
Queue<Integer> queue = new LinkedList<>();
boolean[] visited = new boolean[graph.size()];
int[] distance = new int[graph.size()];
// 从第一个节点开始搜索
queue.offer(0);
visited[0] = true;
// 记录最远节点和距离
int maxDistance = 0, farthestNode = 0;
while (!queue.isEmpty()) {
int u = queue.poll();
for (int v : graph.get(u)) {
if (!visited[v]) {
queue.offer(v);
visited[v] = true;
distance[v] = distance[u] + 1;
if (distance[v] > maxDistance) {
maxDistance = distance[v];
farthestNode = v;
}
}
}
}
// 返回最远节点和距离
return new int[]{farthestNode, maxDistance};
}
private int[] findLongestPath(List<List<Integer>> graph, int start, int end) {
// 广度优先搜索
Queue<Integer> queue = new LinkedList<>();
boolean[] visited = new boolean[graph.size()];
int[] distance = new int[graph.size()];
// 从start节点开始搜索
queue.offer(start);
visited[start] = true;
// 记录最远节点和距离
int maxDistance = 0, farthestNode = 0;
while (!queue.isEmpty()) {
int u = queue.poll();
for (int v : graph.get(u)) {
if (!visited[v]) {
queue.offer(v);
visited[v] = true;
distance[v] = distance[u] + 1;
if (distance[v] > maxDistance) {
maxDistance = distance[v];
farthestNode = v;
}
}
}
}
// 返回最远节点和距离
return new int[]{farthestNode, maxDistance};
}
public static void main(String[] args) {
Solution solution = new Solution();
// 测试用例
int n = 6;
int[][] edges = {{0, 1}, {0, 2}, {1, 3}, {1, 4}, {2, 5}};
TreeNode root = solution.findMinHeightTree(n, edges);
// 打印结果
System.out.println(root.val);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
C++代码
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
class Solution {
public:
TreeNode* findMinHeightTree(int n, vector<vector<int>>& edges) {
// 创建图
vector<vector<int>> graph(n);
for (auto& edge : edges) {
int u = edge[0], v = edge[1];
graph[u].push_back(v);
graph[v].push_back(u);
}
// 找到图的直径
int[] diameter = findDiameter(graph);
int start = diameter[0], end = diameter[1];
// 找到从start到end的最长路径
int[] path = findLongestPath(graph, start, end);
int root = path[0];
// 返回根节点
return new TreeNode(root);
}
private:
int[] findDiameter(vector<vector<int>>& graph) {
// 广度优先搜索
queue<int> queue;
vector<bool> visited(graph.size(), false);
vector<int> distance(graph.size(), 0);
// 从第一个节点开始搜索
queue.push(0);
visited[0] = true;
// 记录最远节点和距离