Skip to content

Commit fedcc87

Browse files
committed
二叉树
二叉树
1 parent f314207 commit fedcc87

10 files changed

Lines changed: 138 additions & 2 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
|[LeetCode-链表](./leetcode_linked_list/main.md)|leetcode链表类算法练习|
1111
|[LeetCode-哈希表](./leetcode_hash/main.md)|leetcode哈希表类算法练习|
1212
|[LeetCode-栈+队列](./leetcode_stack/main.md)|leetcode栈+队列类算法练习|
13-
|[LeetCode-](./leetcode_tree/main.md)|leetcode树类算法练习|
13+
|[LeetCode-二叉树](./leetcode_tree/main.md)|leetcode二叉树类算法练习|
1414
|[Django学习](./django_note/main.md)|Django学习笔记。|
1515
|[其他](./others/main.md)|redis,kafka,ZeroMQ等|

leetcode_stack/main.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
* [用队列实现栈](用队列实现栈.md)
1717
* [删除字符串中的所有相邻重复项](删除字符串中的所有相邻重复项.md)
1818
* [逆波兰表达式求值](逆波兰表达式求值.md)
19+
* [滑动窗口最大值(困难)](滑动窗口最大值.md)
20+
* [前K个高频元素](前K个高频元素.md)
1921

2022
<!--
2123
2. [最小栈](最小栈.md)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# 347.前K个高频元素
2+
## 题目
3+
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
4+
```python
5+
输入: nums = [1,1,1,2,2,3], k = 2
6+
输出: [1,2]
7+
```
8+
9+
## 分析
10+
* 统计每个数字出现的次数
11+
* 排序
12+
13+
```python
14+
def topKFrequent(nums, k):
15+
times_dict = {}
16+
for num in nums:
17+
times_dict[num] = times_dict.get(num, 0) + 1
18+
19+
res_list = sorted(times_dict.items(), key=lambda x:x[1], reverse=True)
20+
ans = []
21+
for i in range(0, k):
22+
ans.append(res_list[i][0])
23+
return ans
24+
```
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# 239.滑动窗口最大值
2+
## 题目
3+
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
4+
5+
返回滑动窗口中的最大值。
6+
7+
```python
8+
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
9+
输出:[3,3,5,5,6,7]
10+
解释:
11+
滑动窗口的位置 最大值
12+
--------------- -----
13+
[1 3 -1] -3 5 3 6 7 3
14+
1 [3 -1 -3] 5 3 6 7 3
15+
1 3 [-1 -3 5] 3 6 7 5
16+
1 3 -1 [-3 5 3] 6 7 5
17+
1 3 -1 -3 [5 3 6] 7 6
18+
1 3 -1 -3 5 [3 6 7] 7
19+
```
20+
21+
## 分析
22+
* 1.窗口形成阶段
23+
* 2.滑动窗口阶段
24+
25+
![](../pic/leetcode_stack/239_1.gif)
26+
参考链接:https://leetcode-cn.com/problems/sliding-window-maximum/solution/dong-hua-yan-shi-dan-diao-dui-lie-239hua-hc5u/
27+
28+
#### 窗口形成阶段
29+
* 窗口大小为k,数组大小为n,初始状态窗口为空,遍历数组前k个元素
30+
* 如果窗口最右端的元素(队列尾部)小于或等于当前新元素,那就将窗口最右端的元素移出窗口,直到窗口最右端元素大于当前新加入元素,或者窗口为空为止,将当前元素的索引值加入窗口(队列实际保存的是元素的索引值)
31+
32+
#### 滑动窗口阶段
33+
* 遍历完前k个元素,继续遍历剩余元素
34+
* 将窗口右端所有小于等于当前元素的元素移出,将新元素添加进窗口
35+
* 如果窗口最左端的元素(索引值)超出了窗口的范围,将其移出窗口
36+
* 每个时刻窗口中元素最大值都在窗口的最左端
37+
38+
#### 为什么要将右端小于等于新元素值的元素移出窗口
39+
![](../pic/leetcode_stack/239_1.png)
40+
41+
新元素3,比2和-5都大,完全可以将2和-5移出,因为后面新加入的元素都只是跟窗口中的最大值比较,这样可以降低时间复杂度
42+
43+
#### 窗口动态变化过程
44+
```python
45+
[-4, 2, -5, 1, -1, 6] , k=3
46+
1. 窗口中的值[0(-4)],0 表示的是-4的下标值,窗口中实际保存的是下标值
47+
2. [1(2)],因为2>-4,所以移出-4
48+
3. [1(2), 2(-5)],此时窗口刚好形成,区域间(0,1,2),最大值为nums[1]=2
49+
4. [1(2), 3(1)], 因为1>-5,所以移出-5,此时窗口区域间(1,2,3),最大值为nums[1]=2
50+
5. [1(2), 3(1), 4(-1)],此时窗口区域间(2,3,4),此时1(2)已经不再窗口范围内了,应该移出,所以窗口应该是[3(1), 4(-1)],最大值为nums[3]=1
51+
6. [5(6)],因为6>-1,6>1,所以移出,此时窗口区域间(3,4,5),最大值nums[5]=6
52+
```
53+
54+
```python
55+
from collections import deque
56+
def maxSlidingWindow(nums, k):
57+
deque_ = deque([])
58+
# 窗口形成
59+
for i in range(k):
60+
while deque_ and nums[i] >= nums[deque_[-1]]:
61+
deque_.pop()
62+
deque_.append(i)
63+
64+
ans = []
65+
ans.append(nums[deque_[0]])
66+
67+
for i in range(k, len(nums)):
68+
while deque_ and nums[i] >= nums[deque_[-1]]:
69+
deque_.pop()
70+
deque_.append(i)
71+
72+
# 窗口区间范围 (i-k+1,k)
73+
while deque_[0] < i - k + 1:
74+
# 不在窗口区间内,移出
75+
deque_.popleft()
76+
77+
ans.append(nums[deque_[0]])
78+
return ans
79+
```

leetcode_tree/main.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,35 @@
1-
## LeetCode树
1+
# LeetCode二叉树
2+
## 1.定义
3+
**二叉树是指树中节点的度不大于2的有序树。递归定义为:二叉树是一个空树,或者由一个根节点和两个互不相交的,分别称为根的左子树和右子树组成的非空树,左子树和右子树又同样是二叉树。**
4+
* 节点:包含一个数据元素和指向子树分支的信息
5+
* 节点的度:一个节点拥有的子树的数目
6+
* 叶子节点:没有子树的节点(度为零的节点)
7+
* 分支节点:度不为零的节点
8+
* 树的度:树中所有节点的度的最大值
9+
* 节点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推
10+
* 树的深度(高度):树中所有节点的层次最大值
11+
12+
#### 满二叉树
13+
如果一颗二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层,这颗二叉树就是满二叉树。
14+
15+
![](../pic/leetcode_tree/manerchashu.png)
16+
#### 完全二叉树
17+
在完全二叉树中,除了最底层的节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边。
18+
(对一颗具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。)
19+
20+
![](../pic/leetcode_tree/wanquantree.png)
21+
#### 二叉搜索树(有序树)
22+
* 一个二叉树,如果左子树不为空,左子树上所有节点的值均小于根节点的值
23+
* 如果右字树不为空,右子树上所有节点的值大于根节点的值
24+
* 左右两个字树也是二叉搜索树
25+
26+
![](../pic/leetcode_tree/paixutree.png)
27+
28+
#### 平衡二叉搜索树
29+
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
30+
31+
## 2.题目
32+
233
1. [相同的树](相同的树.md)
334

435
2. [对称二叉树](对称二叉树.md)

pic/leetcode_stack/239_1.gif

500 KB
Loading

pic/leetcode_stack/239_1.png

4.21 KB
Loading

pic/leetcode_tree/manerchashu.png

13.2 KB
Loading

pic/leetcode_tree/paixutree.png

6.67 KB
Loading

pic/leetcode_tree/wanquantree.png

36.2 KB
Loading

0 commit comments

Comments
 (0)