auto commit

This commit is contained in:
CyC2018 2018-03-24 17:04:56 +08:00
parent a9c355df4a
commit 2d0dd8a1a9
7 changed files with 24 additions and 7 deletions

View File

@ -963,11 +963,17 @@ public class BinarySearchST<Key extends Comparable<Key>, Value> {
**二叉树** 定义为一个空链接,或者是一个有左右两个链接的节点,每个链接都指向一颗子二叉树。
**二叉查找树** BST是一颗二叉树并且每个节点的键都大于其左子树中的任意节点的键而小于右子树的任意节点的键。
<div align="center"> <img src="../pics//dd137585-00bf-428e-8b88-475a8627e8bc.jpg"/> </div><br>
<div align="center"> <img src="../pics//25226bb2-92cc-40cb-9e7f-c44e79fbb64a.jpg"/> </div><br>
**二叉查找树** BST是一颗二叉树并且每个节点的值都大于其左子树中的所有节点的值而小于右子树的所有节点的值。
二叉查找树的查找操作每次迭代都会让区间减少一半,和二分查找类似。
<div align="center"> <img src="../pics//7e0b2961-2ffe-4a24-bef1-1b07a78af268.jpg"/> </div><br>
BST 有一个重要性质,就是它的前序遍历结果为递增排序。
<div align="center"> <img src="../pics//a574c5c8-142d-4f6c-8fd7-8ca9b16b7546.png"/> </div><br>
基本数据结构:
```java
public class BST<Key extends Comparable<Key>, Value> {
@ -1000,7 +1006,11 @@ public class BST<Key extends Comparable<Key>, Value> {
### 1. get()
如果树是空的,则查找未命中;如果被查找的键和根节点的键相等,查找命中,否则递归地在子树中查找:如果被查找的键较小就在左子树中查找,较大就在右子树中查找。
- 如果树是空的,则查找未命中;
- 如果被查找的键和根节点的键相等,查找命中;
- 否则递归地在子树中查找:如果被查找的键较小就在左子树中查找,较大就在右子树中查找。
BST 的查找操作每次递归都会让区间减少一半,和二分查找类似,因此查找的复杂度为 O(logn)。
```java
public Value get(Key key) {
@ -1019,6 +1029,8 @@ private Value get(Node x, Key key) {
当插入的键不存在于树中,需要创建一个新节点,并且更新上层节点的链接使得该节点正确链接到树中。
<div align="center"> <img src="../pics//20a9ec8c-0c19-4196-96f0-b4a0ea43075d.jpg"/> </div><br>
```java
public void put(Key key, Value val) {
root = put(root, key, val);
@ -1038,13 +1050,18 @@ private Node put(Node x, Key key, Value val) {
二叉查找树的算法运行时间取决于树的形状,而树的形状又取决于键被插入的先后顺序。最好的情况下树是完全平衡的,每条空链接和根节点的距离都为 logN。在最坏的情况下树的高度为 N。
<div align="center"> <img src="../pics//73a3983d-dd18-4373-897e-64b706a7e370.jpg"/> </div><br>
<div align="center"> <img src="../pics//a9339620-4689-414f-8e26-19821039614a.jpg"/> </div><br>
复杂度:查找和插入操作都为对数级别。
复杂度:BST 查找和插入操作的平均时间复杂度为对数级别。
### 4. floor()
如果 key 小于根节点的 key那么小于等于 key 的最大键节点一定在左子树中;如果 key 大于根节点的 key只有当根节点右子树中存在小于等于 key 的节点,小于等于 key 的最大键节点才在右子树中,否则根节点就是小于等于 key 的最大键节点。
floor(key):小于等于键的最大键
- 如果键小于根节点的键,那么 floor(key) 一定在左子树中;
- 如果键大于根节点的键,需要先判断右子树中是否存在 floor(key),如果存在就找到,否则根节点就是 floor(key)。
<div align="center"> <img src="../pics//5bbb64ff-bb9a-473e-ab53-8a26a394f813.jpg"/> </div><br>
```java
public Key floor(Key key) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB