Skip to content

Commit b4c7093

Browse files
author
luzhicheng
committed
更新md
更新md
1 parent a78337b commit b4c7093

File tree

4 files changed

+148
-0
lines changed

4 files changed

+148
-0
lines changed

leetcode_tree/main.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
## LeetCode树
22
1. [相同的树](相同的树.md)
3+
34
2. [对称二叉树](对称二叉树.md)
5+
3. [二叉树的最大深度](二叉树的最大深度.md)
6+
4. [二叉树的层次遍历 II](二叉树的层次遍历II.md)
7+
5. [将有序数组转换为二叉搜索树](将有序数组转换为二叉搜索树.md)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
## 二叉树的层次遍历 II
2+
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
3+
#### 示例
4+
```python
5+
3
6+
/ \
7+
9 20
8+
/ \
9+
15 7
10+
11+
返回其自底向上的层次遍历为:
12+
[
13+
[15,7],
14+
[9,20],
15+
[3]
16+
]
17+
```
18+
19+
#### 代码
20+
[二叉树的最大深度](二叉树的最大深度.md)做法相似,遍历二叉树
21+
22+
广度优先搜索:
23+
* 队列存放当前层所有节点
24+
* 每次拓展下一层的时候,需要将当前队列中所有节点都取出来进行拓展
25+
* 保证每次拓展完时候,队列中存放的都是当前层的所有节点
26+
* 用列表保存每层的元素值
27+
28+
```python
29+
def levelOrderBottom(root):
30+
if not root:
31+
return []
32+
queue_ = Queue()
33+
queue_.put(root)
34+
result = []
35+
while queue_.qsize():
36+
size = queue_.qsize()
37+
vals = [] # 用列表保存每层的节点值
38+
for _ in range(size):
39+
node = queue_.get()
40+
vals.append(node.val)
41+
left = node.left
42+
right = node.right
43+
if left:
44+
queue_.put(left)
45+
if right:
46+
queue_.put(right)
47+
result.append(vals)
48+
result.reverse()
49+
return result
50+
```
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
## 二叉树的最大深度
2+
给定一个二叉树,找出其最大深度。
3+
4+
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
5+
6+
叶子节点是指没有子节点的节点。
7+
8+
#### 示例
9+
返回它的最大深度 3 。
10+
```python
11+
3
12+
/ \
13+
9 20
14+
/ \
15+
15 7
16+
```
17+
18+
#### 代码
19+
递归: 最大深度 = max(左子树最大深度,右子树最大深度) + 1
20+
```python
21+
def maxDepth(root):
22+
if not root:
23+
return 0
24+
25+
max_depth_of_subtree = max(maxDepth(root.left), maxDepth(root.right))
26+
return 1 + max_depth_of_subtree
27+
```
28+
29+
广度优先搜索:
30+
* 队列存放当前层所有节点
31+
* 每次拓展下一层的时候,需要将当前队列中所有节点都取出来进行拓展
32+
* 保证每次拓展完时候,队列中存放的都是当前层的所有节点
33+
* 用一个变量维护拓展的次数
34+
35+
```python
36+
def maxDepth(root):
37+
if not root:
38+
return 0
39+
depth = 0
40+
queue_ = Queue()
41+
queue_.put(root)
42+
43+
while queue_.qsize():
44+
depth += 1
45+
size = queue_.qsize()
46+
for _ in range(size):
47+
node = queue_.get()
48+
left = node.left
49+
right = node.right
50+
if left:
51+
queue_.put(left)
52+
if right:
53+
queue_.put(right)
54+
55+
return depth
56+
```
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
## 将有序数组转换为二叉搜索树
2+
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
3+
4+
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
5+
#### 示例
6+
```python
7+
给定有序数组: [-10,-3,0,5,9],
8+
9+
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
10+
11+
0
12+
/ \
13+
-3 9
14+
/ /
15+
-10 5
16+
```
17+
18+
#### 代码
19+
* 选择列表中间数字作为二叉搜索树的根节点,这样分给左右子树的数字个数相同或只相差1,可以使得树保持平衡。
20+
* 把列表从中间元素分成左右两个列表,分别对应根节点的左子树与右子树
21+
* 递归
22+
23+
```python
24+
def sortedArrayToBST(nums):
25+
if not nums:
26+
return
27+
28+
length = len(nums)
29+
middle = length // 2
30+
root = TreeNode(nums[middle])
31+
left = sortedArrayToBST(nums[:middle])
32+
right = sortedArrayToBST(nums[middle + 1:])
33+
if left:
34+
root.left = left
35+
if right:
36+
root.right = right
37+
return root
38+
```

0 commit comments

Comments
 (0)