Organizing all the code blocks.
This commit is contained in:
@@ -91,6 +91,30 @@ comments: true
|
||||
|
||||
```
|
||||
|
||||
=== "JavaScript"
|
||||
|
||||
```js title="binary_search_tree.js"
|
||||
|
||||
```
|
||||
|
||||
=== "TypeScript"
|
||||
|
||||
```typescript title="binary_search_tree.ts"
|
||||
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="binary_search_tree.c"
|
||||
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="binary_search_tree.cs"
|
||||
|
||||
```
|
||||
|
||||
### 插入结点
|
||||
|
||||
给定一个待插入元素 `num` ,为了保持二叉搜索树 “左子树 < 根结点 < 右子树” 的性质,插入操作分为两步:
|
||||
@@ -166,6 +190,30 @@ comments: true
|
||||
|
||||
```
|
||||
|
||||
=== "JavaScript"
|
||||
|
||||
```js title="binary_search_tree.js"
|
||||
|
||||
```
|
||||
|
||||
=== "TypeScript"
|
||||
|
||||
```typescript title="binary_search_tree.ts"
|
||||
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="binary_search_tree.c"
|
||||
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="binary_search_tree.cs"
|
||||
|
||||
```
|
||||
|
||||
为了插入结点,需要借助 **辅助结点 `prev`** 保存上一轮循环的结点,这样在遍历到 $\text{null}$ 时,我们也可以获取到其父结点,从而完成结点插入操作。
|
||||
|
||||
与查找结点相同,插入结点使用 $O(\log n)$ 时间。
|
||||
@@ -320,6 +368,30 @@ comments: true
|
||||
|
||||
```
|
||||
|
||||
=== "JavaScript"
|
||||
|
||||
```js title="binary_search_tree.js"
|
||||
|
||||
```
|
||||
|
||||
=== "TypeScript"
|
||||
|
||||
```typescript title="binary_search_tree.ts"
|
||||
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="binary_search_tree.c"
|
||||
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="binary_search_tree.cs"
|
||||
|
||||
```
|
||||
|
||||
## 二叉搜索树的优势
|
||||
|
||||
假设给定 $n$ 个数字,最常用的存储方式是「数组」,那么对于这串乱序的数字,常见操作的效率为:
|
||||
|
@@ -8,7 +8,7 @@ comments: true
|
||||
|
||||
=== "Java"
|
||||
|
||||
```java
|
||||
```java title=""
|
||||
/* 链表结点类 */
|
||||
class TreeNode {
|
||||
int val; // 结点值
|
||||
@@ -20,7 +20,7 @@ comments: true
|
||||
|
||||
=== "C++"
|
||||
|
||||
```cpp
|
||||
```cpp title=""
|
||||
/* 链表结点结构体 */
|
||||
struct TreeNode {
|
||||
int val; // 结点值
|
||||
@@ -32,7 +32,7 @@ comments: true
|
||||
|
||||
=== "Python"
|
||||
|
||||
```python
|
||||
```python title=""
|
||||
""" 链表结点类 """
|
||||
class TreeNode:
|
||||
def __init__(self, val=0, left=None, right=None):
|
||||
@@ -43,7 +43,31 @@ comments: true
|
||||
|
||||
=== "Go"
|
||||
|
||||
```go
|
||||
```go title=""
|
||||
|
||||
```
|
||||
|
||||
=== "JavaScript"
|
||||
|
||||
```js title=""
|
||||
|
||||
```
|
||||
|
||||
=== "TypeScript"
|
||||
|
||||
```typescript title=""
|
||||
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title=""
|
||||
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title=""
|
||||
|
||||
```
|
||||
|
||||
@@ -142,6 +166,30 @@ comments: true
|
||||
|
||||
```
|
||||
|
||||
=== "JavaScript"
|
||||
|
||||
```js title="binary_tree.js"
|
||||
|
||||
```
|
||||
|
||||
=== "TypeScript"
|
||||
|
||||
```typescript title="binary_tree.ts"
|
||||
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="binary_tree.c"
|
||||
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="binary_tree.cs"
|
||||
|
||||
```
|
||||
|
||||
**插入与删除结点。** 与链表类似,插入与删除结点都可以通过修改指针实现。
|
||||
|
||||

|
||||
@@ -183,6 +231,30 @@ comments: true
|
||||
|
||||
```
|
||||
|
||||
=== "JavaScript"
|
||||
|
||||
```js title="binary_tree.js"
|
||||
|
||||
```
|
||||
|
||||
=== "TypeScript"
|
||||
|
||||
```typescript title="binary_tree.ts"
|
||||
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="binary_tree.c"
|
||||
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="binary_tree.cs"
|
||||
|
||||
```
|
||||
|
||||
!!! note
|
||||
|
||||
插入结点会改变二叉树的原有逻辑结构,删除结点往往意味着删除了该结点的所有子树。因此,二叉树中的插入与删除一般都是由一套操作配合完成的,这样才能实现有意义的操作。
|
||||
@@ -259,6 +331,30 @@ comments: true
|
||||
|
||||
```
|
||||
|
||||
=== "JavaScript"
|
||||
|
||||
```js title="binary_tree_bfs.js"
|
||||
|
||||
```
|
||||
|
||||
=== "TypeScript"
|
||||
|
||||
```typescript title="binary_tree_bfs.ts"
|
||||
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="binary_tree_bfs.c"
|
||||
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="binary_tree_bfs.cs"
|
||||
|
||||
```
|
||||
|
||||
### 前序、中序、后序遍历
|
||||
|
||||
相对地,前、中、后序遍历皆属于「深度优先遍历 Depth-First Traversal」,其体现着一种 “先走到尽头,再回头继续” 的回溯遍历方式。
|
||||
@@ -353,6 +449,30 @@ comments: true
|
||||
|
||||
```
|
||||
|
||||
=== "JavaScript"
|
||||
|
||||
```js title="binary_tree_dfs.js"
|
||||
|
||||
```
|
||||
|
||||
=== "TypeScript"
|
||||
|
||||
```typescript title="binary_tree_dfs.ts"
|
||||
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="binary_tree_dfs.c"
|
||||
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="binary_tree_dfs.cs"
|
||||
|
||||
```
|
||||
|
||||
!!! note
|
||||
|
||||
使用循环一样可以实现前、中、后序遍历,但代码相对繁琐,有兴趣的同学可以自行实现。
|
||||
|
@@ -16,7 +16,8 @@ comments: true
|
||||
|
||||
完美二叉树的性质有:
|
||||
|
||||
- 若树高度 $= h$ ,则结点总数 $= 2^h$ - 1;
|
||||
- 若树高度 $= h$ ,则结点总数 $= 2^h - 1$;
|
||||
- (TODO)
|
||||
|
||||
## 完全二叉树
|
||||
|
||||
@@ -26,7 +27,7 @@ comments: true
|
||||
|
||||
完全二叉树有一个很好的性质,可以用「数组」来表示。
|
||||
|
||||
-
|
||||
- (TODO)
|
||||
|
||||
## 完满二叉树
|
||||
|
||||
@@ -39,3 +40,5 @@ comments: true
|
||||
**「平衡二叉树 Balanced Binary Tree」,又称「AVL 树」** ,其任意结点的左子树和右子树的高度之差的绝对值 $\leq 1$ 。
|
||||
|
||||

|
||||
|
||||
- (TODO)
|
||||
|
Reference in New Issue
Block a user