Skip to content

Commit 241c3f1

Browse files
committed
feat: add solutions to lc problem: No.1719
No.1719.Number Of Ways To Reconstruct A Tree
1 parent df6aa0e commit 241c3f1

File tree

6 files changed

+553
-2
lines changed

6 files changed

+553
-2
lines changed

solution/1700-1799/1719.Number Of Ways To Reconstruct A Tree/README.md

Lines changed: 194 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,22 +74,215 @@
7474

7575
<!-- 这里可写通用的实现逻辑 -->
7676

77+
题目性质:假设祖先节点为 x ,后代节点为 y ,则 x 在 pairs 中的出现次数一定大于等于 y 在 pairs 中的出现次数,且当等号成立时 x、y 可互换位置。
78+
79+
思路:
80+
81+
1. 用邻接矩阵、邻接表存放 pairs。
82+
1. 将树中所有节点 nodes 按照出现的次数升序排列。设置 equal 标志,用来记录是否出现“次数相同”的祖孙节点,root 用来记录没有父节点的节点数。
83+
1. 遍历每个节点 `nodes[i]`(记为 x),找出出现次数大于 x 的节点 y。如果 x 跟 y 构成祖孙关系,那么 y 的邻居 z 也需要构成祖孙关系。否则直接返回 0。
84+
85+
遍历结束,判断 root 的个数,若大于 1,说明不满足只有一个根节点,返回 0。若 equal 为真,说明存在可互换祖孙关系的节点对,返回 2;否则返回 1。
86+
7787
<!-- tabs:start -->
7888

7989
### **Python3**
8090

8191
<!-- 这里可写当前语言的特殊实现逻辑 -->
8292

8393
```python
84-
94+
class Solution:
95+
def checkWays(self, pairs: List[List[int]]) -> int:
96+
g = [[False] * 510 for _ in range(510)]
97+
v = defaultdict(list)
98+
for x, y in pairs:
99+
g[x][y] = g[y][x] = True
100+
v[x].append(y)
101+
v[y].append(x)
102+
nodes = []
103+
for i in range(510):
104+
if v[i]:
105+
nodes.append(i)
106+
g[i][i] = True
107+
nodes.sort(key=lambda x: len(v[x]))
108+
equal = False
109+
root = 0
110+
for i, x in enumerate(nodes):
111+
j = i + 1
112+
while j < len(nodes) and not g[x][nodes[j]]:
113+
j += 1
114+
if j < len(nodes):
115+
y = nodes[j]
116+
if len(v[x]) == len(v[y]):
117+
equal = True
118+
for z in v[x]:
119+
if not g[y][z]:
120+
return 0
121+
else:
122+
root += 1
123+
if root > 1:
124+
return 0
125+
return 2 if equal else 1
85126
```
86127

87128
### **Java**
88129

89130
<!-- 这里可写当前语言的特殊实现逻辑 -->
90131

91132
```java
133+
class Solution {
134+
public int checkWays(int[][] pairs) {
135+
boolean[][] g = new boolean[510][510];
136+
List<Integer>[] v = new List[510];
137+
for (int i = 0; i < 510; ++i) {
138+
v[i] = new ArrayList<>();
139+
}
140+
for (int[] p : pairs) {
141+
int x = p[0], y = p[1];
142+
g[x][y] = true;
143+
g[y][x] = true;
144+
v[x].add(y);
145+
v[y].add(x);
146+
}
147+
List<Integer> nodes = new ArrayList<>();
148+
for (int i = 0; i < 510; ++i) {
149+
if (!v[i].isEmpty()) {
150+
nodes.add(i);
151+
g[i][i] = true;
152+
}
153+
}
154+
nodes.sort(Comparator.comparingInt(a -> v[a].size()));
155+
boolean equal = false;
156+
int root = 0;
157+
for (int i = 0; i < nodes.size(); ++i) {
158+
int x = nodes.get(i);
159+
int j = i + 1;
160+
for (; j < nodes.size() && !g[x][nodes.get(j)]; ++j);
161+
if (j < nodes.size()) {
162+
int y = nodes.get(j);
163+
if (v[x].size() == v[y].size()) {
164+
equal = true;
165+
}
166+
for (int z : v[x]) {
167+
if (!g[y][z]) {
168+
return 0;
169+
}
170+
}
171+
} else {
172+
++root;
173+
}
174+
}
175+
if (root > 1) {
176+
return 0;
177+
}
178+
return equal ? 2 : 1;
179+
}
180+
}
181+
```
182+
183+
### **C++**
184+
185+
```cpp
186+
class Solution {
187+
public:
188+
int checkWays(vector<vector<int>>& pairs) {
189+
vector<vector<bool>> g(510, vector<bool>(510));
190+
vector<vector<int>> v(510);
191+
for (auto& p : pairs)
192+
{
193+
int x = p[0], y = p[1];
194+
g[x][y] = g[y][x] = 1;
195+
v[x].push_back(y);
196+
v[y].push_back(x);
197+
}
198+
vector<int> nodes;
199+
for (int i = 1; i <= 500; ++i)
200+
{
201+
if (v[i].size())
202+
{
203+
nodes.push_back(i);
204+
g[i][i] = 1;
205+
}
206+
}
207+
sort(nodes.begin(), nodes.end(), [&](int x, int y)->bool{return v[x].size() < v[y].size();});
208+
bool equal = 0;
209+
int root = 0;
210+
for (int i = 0; i < nodes.size(); ++i)
211+
{
212+
int x = nodes[i];
213+
int j = i + 1;
214+
for (; j < nodes.size() && !g[x][nodes[j]]; ++j);
215+
if (j < nodes.size())
216+
{
217+
int y = nodes[j];
218+
if (v[x].size() == v[y].size()) equal = 1;
219+
for (int z : v[x])
220+
if (!g[y][z])
221+
return 0;
222+
}
223+
else ++root;
224+
}
225+
if (root > 1) return 0;
226+
if (equal) return 2;
227+
return 1;
228+
}
229+
};
230+
```
92231
232+
### **Go**
233+
234+
```go
235+
func checkWays(pairs [][]int) int {
236+
g := make([][]bool, 510)
237+
v := make([][]int, 510)
238+
for i := range g {
239+
g[i] = make([]bool, 510)
240+
}
241+
for _, p := range pairs {
242+
x, y := p[0], p[1]
243+
g[x][y] = true
244+
g[y][x] = true
245+
v[x] = append(v[x], y)
246+
v[y] = append(v[y], x)
247+
}
248+
var nodes []int
249+
for i := 1; i <= 500; i++ {
250+
if len(v[i]) > 0 {
251+
nodes = append(nodes, i)
252+
g[i][i] = true
253+
}
254+
}
255+
sort.Slice(nodes, func(i, j int) bool {
256+
return len(v[nodes[i]]) < len(v[nodes[j]])
257+
})
258+
equal := false
259+
root := 0
260+
for i, x := range nodes {
261+
j := i + 1
262+
for ; j < len(nodes) && !g[x][nodes[j]]; j++ {
263+
}
264+
if j < len(nodes) {
265+
y := nodes[j]
266+
if len(v[x]) == len(v[y]) {
267+
equal = true
268+
}
269+
for _, z := range v[x] {
270+
if !g[y][z] {
271+
return 0
272+
}
273+
}
274+
} else {
275+
root++
276+
}
277+
}
278+
if root > 1 {
279+
return 0
280+
}
281+
if equal {
282+
return 2
283+
}
284+
return 1
285+
}
93286
```
94287

95288
### **...**

0 commit comments

Comments
 (0)