更新图片链接
This commit is contained in:
@@ -105,13 +105,13 @@ bool isSame(int u, int v) {
|
||||
|
||||
搜索过程像是一个多叉树中从叶子到根节点的过程,如图:
|
||||
|
||||

|
||||

|
||||
|
||||
如果这棵多叉树高度很深的话,每次find函数 去寻找根的过程就要递归很多次。
|
||||
|
||||
我们的目的只需要知道这些节点在同一个根下就可以,所以对这棵多叉树的构造只需要这样就可以了,如图:
|
||||
|
||||

|
||||

|
||||
|
||||
除了根节点其他所有节点都挂载根节点下,这样我们在寻根的时候就很快,只需要一步,
|
||||
|
||||
@@ -226,7 +226,7 @@ join(3, 2);
|
||||
|
||||
此时构成的图是这样的:
|
||||
|
||||

|
||||

|
||||
|
||||
此时问 1,3是否在同一个集合,我们调用 `join(1, 2); join(3, 2);` 很明显本意要表示 1,3是在同一个集合。
|
||||
|
||||
@@ -256,7 +256,7 @@ join(3, 2);
|
||||
|
||||
构成的图是这样的:
|
||||
|
||||

|
||||

|
||||
|
||||
因为在join函数里,我们有find函数进行寻根的过程,这样就保证元素 1,2,3在这个有向图里是强连通的。
|
||||
|
||||
@@ -275,12 +275,12 @@ join(3, 2);
|
||||
|
||||
1、`join(1, 8);`
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
2、`join(3, 8);`
|
||||
|
||||

|
||||

|
||||
|
||||
有录友可能想,`join(3, 8)` 在图中为什么 将 元素1 连向元素 3 而不是将 元素 8 连向 元素 3 呢?
|
||||
|
||||
@@ -288,12 +288,12 @@ join(3, 2);
|
||||
|
||||
3、`join(1, 7);`
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
4、`join(8, 5);`
|
||||
|
||||

|
||||

|
||||
|
||||
这里8的根是3,那么 5 应该指向 8 的根 3,这里的原因,我们在上面「常见误区」已经讲过了。 但 为什么 图中 8 又直接指向了 3 了呢?
|
||||
|
||||
@@ -310,11 +310,11 @@ int find(int u) {
|
||||
|
||||
5、`join(2, 9);`
|
||||
|
||||

|
||||

|
||||
|
||||
6、`join(6, 9);`
|
||||
|
||||

|
||||

|
||||
|
||||
这里为什么是 2 指向了 6,因为 9的根为 2,所以用2指向6。
|
||||
|
||||
@@ -347,13 +347,13 @@ rank表示树的高度,即树中结点层次的最大值。
|
||||
|
||||
例如两个集合(多叉树)需要合并,如图所示:
|
||||
|
||||

|
||||

|
||||
|
||||
树1 rank 为2,树2 rank 为 3。那么合并两个集合,是 树1 合入 树2,还是 树2 合入 树1呢?
|
||||
|
||||
我们来看两个不同方式合入的效果。
|
||||
|
||||

|
||||

|
||||
|
||||
这里可以看出,树2 合入 树1 会导致整棵树的高度变的更高,而 树1 合入 树2 整棵树的高度 和 树2 保持一致。
|
||||
|
||||
@@ -454,3 +454,4 @@ void join(int u, int v) {
|
||||
|
||||
敬请期待 并查集题目精讲系列。
|
||||
|
||||
<div align="center"><a href="https://www.nowcoder.com/link/wx_sqlcarl199" target="_blank"><img src="https://code-thinking-1253855093.file.myqcloud.com/pics/20220416223343.png" width="1000"/></a></div>
|
||||
|
||||
Reference in New Issue
Block a user