Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
9ab0c5dd65
@ -79,16 +79,19 @@ func (l *MyList) insert(num, index int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 删除元素 */
|
/* 删除元素 */
|
||||||
func (l *MyList) remove(index int) {
|
func (l *MyList) remove(index int) int {
|
||||||
if index >= l.numsSize {
|
if index >= l.numsSize {
|
||||||
panic("索引越界")
|
panic("索引越界")
|
||||||
}
|
}
|
||||||
|
num := l.nums[index]
|
||||||
// 索引 i 之后的元素都向前移动一位
|
// 索引 i 之后的元素都向前移动一位
|
||||||
for j := index; j < l.numsSize-1; j++ {
|
for j := index; j < l.numsSize-1; j++ {
|
||||||
l.nums[j] = l.nums[j+1]
|
l.nums[j] = l.nums[j+1]
|
||||||
}
|
}
|
||||||
// 更新元素数量
|
// 更新元素数量
|
||||||
l.numsSize--
|
l.numsSize--
|
||||||
|
// 返回被删除元素
|
||||||
|
return num
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 列表扩容 */
|
/* 列表扩容 */
|
||||||
@ -103,4 +106,4 @@ func (l *MyList) extendCapacity() {
|
|||||||
func (l *MyList) toArray() []int {
|
func (l *MyList) toArray() []int {
|
||||||
// 仅转换有效长度范围内的列表元素
|
// 仅转换有效长度范围内的列表元素
|
||||||
return l.nums[:l.numsSize]
|
return l.nums[:l.numsSize]
|
||||||
}
|
}
|
||||||
|
@ -55,11 +55,14 @@ class MyList:
|
|||||||
""" 删除元素 """
|
""" 删除元素 """
|
||||||
def remove(self, index):
|
def remove(self, index):
|
||||||
assert index < self.__size, "索引越界"
|
assert index < self.__size, "索引越界"
|
||||||
|
num = self.nums[index]
|
||||||
# 索引 i 之后的元素都向前移动一位
|
# 索引 i 之后的元素都向前移动一位
|
||||||
for j in range(index, self.__size - 1):
|
for j in range(index, self.__size - 1):
|
||||||
self.__nums[j] = self.__nums[j + 1]
|
self.__nums[j] = self.__nums[j + 1]
|
||||||
# 更新元素数量
|
# 更新元素数量
|
||||||
self.__size -= 1
|
self.__size -= 1
|
||||||
|
# 返回被删除元素
|
||||||
|
return num
|
||||||
|
|
||||||
""" 列表扩容 """
|
""" 列表扩容 """
|
||||||
def extend_capacity(self):
|
def extend_capacity(self):
|
||||||
|
@ -57,7 +57,11 @@ comments: true
|
|||||||
=== "C++"
|
=== "C++"
|
||||||
|
|
||||||
```cpp title=""
|
```cpp title=""
|
||||||
|
/* 使用多种「基本数据类型」来初始化「数组」 */
|
||||||
|
int numbers[5];
|
||||||
|
float decimals[5];
|
||||||
|
char characters[5];
|
||||||
|
bool booleans[5];
|
||||||
```
|
```
|
||||||
|
|
||||||
=== "Python"
|
=== "Python"
|
||||||
@ -88,6 +92,11 @@ comments: true
|
|||||||
=== "C"
|
=== "C"
|
||||||
|
|
||||||
```c title=""
|
```c title=""
|
||||||
|
/* 使用多种「基本数据类型」来初始化「数组」 */
|
||||||
|
int numbers[10];
|
||||||
|
float decimals[10];
|
||||||
|
char characters[10];
|
||||||
|
bool booleans[10];
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -108,12 +108,12 @@ comments: true
|
|||||||
|
|
||||||
结点的两个指针分别指向「左子结点 Left Child Node」和「右子结点 Right Child Node」,并且称该结点为两个子结点的「父结点 Parent Node」。给定二叉树某结点,将左子结点以下的树称为该结点的「左子树 Left Subtree」,右子树同理。
|
结点的两个指针分别指向「左子结点 Left Child Node」和「右子结点 Right Child Node」,并且称该结点为两个子结点的「父结点 Parent Node」。给定二叉树某结点,将左子结点以下的树称为该结点的「左子树 Left Subtree」,右子树同理。
|
||||||
|
|
||||||
|
除了叶结点外,每个结点都有子结点和子树。例如,若将上图的「结点 2」看作父结点,那么其左子结点和右子结点分别为「结点 4」和「结点 5」,左子树和右子树分别为「结点 4 以下的树」和「结点 5 以下的树」。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
<p align="center"> Fig. 子结点与子树 </p>
|
<p align="center"> Fig. 子结点与子树 </p>
|
||||||
|
|
||||||
需要注意,父结点、子结点、子树是可以向下递推的。例如,如果将上图的「结点 2」看作父结点,那么其左子结点和右子结点分别为「结点 4」和「结点 5」,左子树和右子树分别为「结点 4 以下的树」和「结点 5 以下的树」。
|
|
||||||
|
|
||||||
## 二叉树常见术语
|
## 二叉树常见术语
|
||||||
|
|
||||||
二叉树的术语较多,建议尽量理解并记住。后续可能遗忘,可以在需要使用时回来查看确认。
|
二叉树的术语较多,建议尽量理解并记住。后续可能遗忘,可以在需要使用时回来查看确认。
|
||||||
|
@ -3,3 +3,16 @@ comments: true
|
|||||||
---
|
---
|
||||||
|
|
||||||
# 小结
|
# 小结
|
||||||
|
|
||||||
|
- 二叉树是一种非线性数据结构,代表着“一分为二”的分治逻辑。二叉树的结点包含「值」和两个「指针」,分别指向左子结点和右子结点。
|
||||||
|
- 选定二叉树中某结点,将其左(右)子结点以下形成的树称为左(右)子树。
|
||||||
|
- 二叉树的术语较多,包括根结点、叶结点、层、度、边、高度、深度等。
|
||||||
|
- 二叉树的初始化、结点插入、结点删除操作与链表的操作方法类似。
|
||||||
|
- 常见的二叉树类型包括完美二叉树、完全二叉树、完满二叉树、平衡二叉树。完美二叉树是理想状态,链表则是退化后的最差状态。
|
||||||
|
- 二叉树可以使用数组表示,具体做法是将结点值和空位按照层序遍历的顺序排列,并基于父结点和子结点之间的索引映射公式实现指针。
|
||||||
|
|
||||||
|
- 二叉树层序遍历是一种广度优先搜索,体现着“一圈一圈向外”的层进式遍历方式,通常借助队列来实现。
|
||||||
|
- 前序、中序、后序遍历是深度优先搜索,体现着“走到头、再回头继续”的回溯遍历方式,通常使用递归实现。
|
||||||
|
- 二叉搜索树是一种高效的元素查找数据结构,查找、插入、删除操作的时间复杂度皆为 $O(\log n)$ 。二叉搜索树退化为链表后,各项时间复杂度劣化至 $O(n)$ ,因此如何避免退化是非常重要的课题。
|
||||||
|
- AVL 树又称平衡二叉搜索树,其通过旋转操作,使得在不断插入与删除结点后,仍然可以保持二叉树的平衡(不退化)。
|
||||||
|
- AVL 树的旋转操作分为右旋、左旋、先右旋后左旋、先左旋后右旋。在插入或删除结点后,AVL 树会从底置顶地执行旋转操作,使树恢复平衡。
|
Loading…
Reference in New Issue
Block a user