auto commit
32
notes/算法.md
|
@ -963,15 +963,16 @@ public class BinarySearchST<Key extends Comparable<Key>, Value> {
|
||||||
|
|
||||||
**二叉树** 定义为一个空链接,或者是一个有左右两个链接的节点,每个链接都指向一颗子二叉树。
|
**二叉树** 定义为一个空链接,或者是一个有左右两个链接的节点,每个链接都指向一颗子二叉树。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//dd137585-00bf-428e-8b88-475a8627e8bc.jpg"/> </div><br>
|
<div align="center"> <img src="../pics//0c723f4c-e13d-42f7-aeb2-1f160c7cc4b6.png" width="300"/> </div><br>
|
||||||
|
|
||||||
**二叉查找树** (BST)是一颗二叉树,并且每个节点的值都大于其左子树中的所有节点的值而小于右子树的所有节点的值。
|
**二叉查找树** (BST)是一颗二叉树,并且每个节点的值都大于其左子树中的所有节点的值而小于右子树的所有节点的值。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//7e0b2961-2ffe-4a24-bef1-1b07a78af268.jpg"/> </div><br>
|
<div align="center"> <img src="../pics//1c012d74-6b9d-4f25-a016-7ad4f1fdeee1.png" width="350"/> </div><br>
|
||||||
|
|
||||||
BST 有一个重要性质,就是它的前序遍历结果为递增排序。
|
BST 有一个重要性质,就是它的前序遍历结果递增排序。
|
||||||
|
|
||||||
|
<div align="center"> <img src="../pics//5c0bb285-b917-446b-84a2-9810ee40d041.png" width="400"/> </div><br>
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//a574c5c8-142d-4f6c-8fd7-8ca9b16b7546.png"/> </div><br>
|
|
||||||
|
|
||||||
基本数据结构:
|
基本数据结构:
|
||||||
|
|
||||||
|
@ -1029,7 +1030,7 @@ private Value get(Node x, Key key) {
|
||||||
|
|
||||||
当插入的键不存在于树中,需要创建一个新节点,并且更新上层节点的链接使得该节点正确链接到树中。
|
当插入的键不存在于树中,需要创建一个新节点,并且更新上层节点的链接使得该节点正确链接到树中。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//20a9ec8c-0c19-4196-96f0-b4a0ea43075d.jpg"/> </div><br>
|
<div align="center"> <img src="../pics//78570a06-0781-4f9d-9093-70a8711785b5.jpg" width="400"/> </div><br>
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public void put(Key key, Value val) {
|
public void put(Key key, Value val) {
|
||||||
|
@ -1050,7 +1051,8 @@ private Node put(Node x, Key key, Value val) {
|
||||||
|
|
||||||
二叉查找树的算法运行时间取决于树的形状,而树的形状又取决于键被插入的先后顺序。最好的情况下树是完全平衡的,每条空链接和根节点的距离都为 logN。在最坏的情况下,树的高度为 N。
|
二叉查找树的算法运行时间取决于树的形状,而树的形状又取决于键被插入的先后顺序。最好的情况下树是完全平衡的,每条空链接和根节点的距离都为 logN。在最坏的情况下,树的高度为 N。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//a9339620-4689-414f-8e26-19821039614a.jpg"/> </div><br>
|
<div align="center"> <img src="../pics//0dd97d9e-7a38-460e-a2ac-3e4511145240.png" width="300"/> </div><br>
|
||||||
|
|
||||||
|
|
||||||
复杂度:BST 查找和插入操作的平均时间复杂度为对数级别。
|
复杂度:BST 查找和插入操作的平均时间复杂度为对数级别。
|
||||||
|
|
||||||
|
@ -1061,8 +1063,7 @@ floor(key):小于等于键的最大键
|
||||||
- 如果键小于根节点的键,那么 floor(key) 一定在左子树中;
|
- 如果键小于根节点的键,那么 floor(key) 一定在左子树中;
|
||||||
- 如果键大于根节点的键,需要先判断右子树中是否存在 floor(key),如果存在就找到,否则根节点就是 floor(key)。
|
- 如果键大于根节点的键,需要先判断右子树中是否存在 floor(key),如果存在就找到,否则根节点就是 floor(key)。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//5bbb64ff-bb9a-473e-ab53-8a26a394f813.jpg"/> </div><br>
|
<div align="center"> <img src="../pics//3efca49f-eecf-41fc-83aa-6a4a95e025ea.png" width="400"/> </div><br>
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public Key floor(Key key) {
|
public Key floor(Key key) {
|
||||||
Node x = floor(root, key);
|
Node x = floor(root, key);
|
||||||
|
@ -1085,6 +1086,12 @@ private Node floor(Node x, Key key) {
|
||||||
|
|
||||||
### 5. rank()
|
### 5. rank()
|
||||||
|
|
||||||
|
rank(key) 返回 key 的排名。
|
||||||
|
|
||||||
|
- 如果键和根节点的键相等,返回左子树的节点数;
|
||||||
|
- 如果小于,递归计算在左子树中的排名;
|
||||||
|
- 如果大于,递归计算在右子树中的排名,并加上左子树的节点数,再加上 1(根节点)。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public int rank(Key key) {
|
public int rank(Key key) {
|
||||||
return rank(key, root);
|
return rank(key, root);
|
||||||
|
@ -1111,7 +1118,7 @@ private Node min(Node x) {
|
||||||
|
|
||||||
令指向最小节点的链接指向最小节点的右子树。
|
令指向最小节点的链接指向最小节点的右子树。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//6e2cb20a-8d2a-46fe-9ac7-68a2126b7bd5.jpg"/> </div><br>
|
<div align="center"> <img src="../pics//392fb173-9713-433c-b37b-ea63ba76eae4.png" width="400"/> </div><br>
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public void deleteMin() {
|
public void deleteMin() {
|
||||||
|
@ -1127,9 +1134,10 @@ public Node deleteMin(Node x) {
|
||||||
|
|
||||||
### 8. delete()
|
### 8. delete()
|
||||||
|
|
||||||
如果待删除的节点只有一个子树,那么只需要让指向待删除节点的链接指向唯一的子树即可;否则,让右子树的最小节点替换该节点。
|
- 如果待删除的节点只有一个子树,那么只需要让指向待删除节点的链接指向唯一的子树即可;
|
||||||
|
- 否则,让右子树的最小节点替换该节点。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//b488282d-bfe0-464f-9e91-1f5b83a975bd.jpg"/> </div><br>
|
<div align="center"> <img src="../pics//691e8da5-fa65-4ee0-a4a9-bd9adba945ff.jpg" width="400"/> </div><br>
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public void delete(Key key) {
|
public void delete(Key key) {
|
||||||
|
@ -1155,7 +1163,7 @@ private Node delete(Node x, Key key) {
|
||||||
|
|
||||||
### 9. keys()
|
### 9. keys()
|
||||||
|
|
||||||
利用二叉查找树中序遍历的结果为有序序列的特点。
|
利用二叉查找树中序遍历的结果为递增的特点。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public Iterable<Key> keys(Key lo, Key hi) {
|
public Iterable<Key> keys(Key lo, Key hi) {
|
||||||
|
|
BIN
pics/0c723f4c-e13d-42f7-aeb2-1f160c7cc4b6.png
Normal file
After Width: | Height: | Size: 61 KiB |
BIN
pics/0dd97d9e-7a38-460e-a2ac-3e4511145240.png
Normal file
After Width: | Height: | Size: 55 KiB |
BIN
pics/1c012d74-6b9d-4f25-a016-7ad4f1fdeee1.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
pics/392fb173-9713-433c-b37b-ea63ba76eae4.png
Normal file
After Width: | Height: | Size: 143 KiB |
BIN
pics/3efca49f-eecf-41fc-83aa-6a4a95e025ea.png
Normal file
After Width: | Height: | Size: 121 KiB |
BIN
pics/5c0bb285-b917-446b-84a2-9810ee40d041.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
pics/691e8da5-fa65-4ee0-a4a9-bd9adba945ff.jpg
Normal file
After Width: | Height: | Size: 105 KiB |
BIN
pics/78570a06-0781-4f9d-9093-70a8711785b5.jpg
Normal file
After Width: | Height: | Size: 85 KiB |