Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
yjjnls committed Feb 26, 2018
1 parent a83da46 commit 1dad195
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions doc/tree.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
- [1.4 Balance](#14-balance)
- [2. Heap](#2-heap)
- [2.1 Insert](#21-insert)
- [★★★](#%E2%98%85%E2%98%85%E2%98%85)
- [2.2 Delete](#22-delete)
- [3. Advanced Search Tree](#3-advanced-search-tree)
- [3.1 RB Tree](#31-rb-tree)
Expand Down Expand Up @@ -114,6 +115,7 @@ struct TreeNode {
- 98 Validate Binary Search Tree
- 101 Symmetric Tree
- 104 Maximum Depth of Binary Tree
- 110 Balanced Binary Tree
- 111 Minimum Depth of Binary Tree
- 226 Invert Binary Tree
- 235 Lowest Common Ancestor of a Binary Search Tree
Expand Down Expand Up @@ -219,7 +221,7 @@ int minDepth(TreeNode *root)
3. **被删除结点有两个儿子。那么,先找出它的后继结点;然后把“它的后继结点的内容”复制给“该结点的内容”;之后,删除“它的后继结点”。**
在这里,后继结点相当于替身,在将后继结点的内容复制给"被删除结点"之后,再将后继结点删除。这样就巧妙的将问题转换为"删除后继结点"的情况了,下面就考虑后继结点。
由于是二叉搜索树,所以后继结点是指右子树中最小的结点,也就是大于要删除结点的第一个结点。而该后继结点如果还存在左孩子,那么左孩子一定比该结点小,那么后继结点就不成立。所以找到的后继结点,其左子树一定为空,如果右子树也为空,那么就是情况1;如果右子树不为空,那么就是情况2,再作相应处理即可。
由于是二叉搜索树,所以后继结点是指右子树中最小的结点,也就是大于要删除结点的第一个结点。而该后继结点如果还存在左孩子,那么左孩子一定比该结点小,那么后继结点就不成立。**所以找到的后继结点,其左子树一定为空**,如果右子树也为空,那么就是情况1;如果右子树不为空,那么就是情况2,再作相应处理即可。
### 1.3 Traversal
Expand Down Expand Up @@ -279,7 +281,9 @@ inorder

## 2. Heap

这里的堆并不是指内存中的堆栈,而是指大顶堆与小顶堆这样的结构,其本质上也是一颗 **二叉平衡树**。其顶点值为树中的最大值或者最小值。但是值得注意的是,**堆除了顶点为最大值之外,内部子树并不能保证像二叉搜索树那样有序,但是每棵子树的顶点都是该子树的最大值**
这里的堆并不是指内存中的堆栈,而是指大顶堆与小顶堆这样的结构,其本质上也是一颗 **二叉平衡树**。其顶点值为树中的最大值或者最小值。但是值得注意的是,**堆除了顶点为最大值之外,内部子树并不能保证像二叉搜索树那样有序,但是每棵子树的顶点都是该子树的最大值**

堆是一个`完全二叉树`的结构。

### 2.1 Insert

Expand All @@ -295,6 +299,11 @@ inorder

**单次插入的时间复杂度为O(logn),但是建堆时所有元素插入后调整的复杂度为O(n)**

#### ★★★
* 堆的插入过程,总是按照完全二叉树的位置在末尾插入元素,然后依次向上**上浮**,直到调整到合适的位置。
* 而删除的过程,则是将堆顶和堆尾互换,然后堆顶元素**下滤**
* 但是建堆的过程则不一样,可以是直接一个个元素插入,但是一般按照floyd算法来建堆。所有数据按照完全二叉树的位置插入,然后从len/2到0来调整堆,相当于每次把元素插入堆顶,然后**下滤**`这样就可以和删除过程用同样的堆调整算法`

### 2.2 Delete

**堆只能删除堆顶元素,而不能直接删除中间的某个元素。** 删除堆顶元素后,要对堆进行重新调整,使得堆顶仍为最大值或者最小值。
Expand Down

0 comments on commit 1dad195

Please sign in to comment.