Skip to content

Commit d653dda

Browse files
committed
feat: add 108
1 parent 811ad31 commit d653dda

File tree

7 files changed

+157
-98
lines changed

7 files changed

+157
-98
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
|101|[Symmetric Tree][101]|Tree, Depth-first Search, Breadth-first Search|
3131
|104|[Maximum Depth of Binary Tree][104]|Tree, Depth-first Search|
3232
|107|[Binary Tree Level Order Traversal II][107]|Tree, Breadth-first Search|
33+
|108|[Binary Tree Level Order Traversal II][107]|Tree, Depth-first Search|
3334

3435

3536
## Medium

note/108/README.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# [Convert Sorted Array to Binary Search Tree][title]
2+
3+
## Description
4+
5+
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
6+
7+
**Tags:** Tree, Depth-first Search
8+
9+
10+
## 思路
11+
12+
题意是把一个有序数组转化为一棵二叉搜索树,二叉搜索树具有以下性质:
13+
14+
1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
15+
2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
16+
3. 任意节点的左、右子树也分别为二叉查找树;
17+
4. 没有键值相等的节点。
18+
19+
所以我们可以用递归来构建一棵二叉搜索树,每次把数组分为两半,把数组中间的值作为其父节点,然后把数组的左右两部分继续构造其左右子树。
20+
21+
22+
``` java
23+
/**
24+
* Definition for a binary tree node.
25+
* public class TreeNode {
26+
* int val;
27+
* TreeNode left;
28+
* TreeNode right;
29+
* TreeNode(int x) { val = x; }
30+
* }
31+
*/
32+
class Solution {
33+
public TreeNode sortedArrayToBST(int[] nums) {
34+
if (nums == null || nums.length == 0) return null;
35+
return helper(nums, 0, nums.length - 1);
36+
}
37+
38+
private TreeNode helper(int[] nums, int left, int right) {
39+
if (left > right) return null;
40+
int mid = (left + right) >>> 1;
41+
TreeNode node = new TreeNode(nums[mid]);
42+
node.left = helper(nums, left, mid - 1);
43+
node.right = helper(nums, mid + 1, right);
44+
return node;
45+
}
46+
}
47+
```
48+
49+
50+
## 结语
51+
52+
如果你同我一样热爱数据结构、算法、LeetCode,可以关注我GitHub上的LeetCode题解:[awesome-java-leetcode][ajl]
53+
54+
55+
56+
[title]: https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree
57+
[ajl]: https://github.com/Blankj/awesome-java-leetcode

project/leetcode/.idea/workspace.xml

Lines changed: 65 additions & 97 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Binary file not shown.
Binary file not shown.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.blankj.easy._108;
2+
3+
4+
import com.blankj.structure.TreeNode;
5+
6+
/**
7+
* <pre>
8+
* author: Blankj
9+
* blog : http://blankj.com
10+
* time : 2017/10/09
11+
* desc :
12+
* </pre>
13+
*/
14+
public class Solution {
15+
public TreeNode sortedArrayToBST(int[] nums) {
16+
if (nums == null || nums.length == 0) return null;
17+
return helper(nums, 0, nums.length - 1);
18+
}
19+
20+
private TreeNode helper(int[] nums, int left, int right) {
21+
if (left > right) return null;
22+
int mid = (left + right) >>> 1;
23+
TreeNode node = new TreeNode(nums[mid]);
24+
node.left = helper(nums, left, mid - 1);
25+
node.right = helper(nums, mid + 1, right);
26+
return node;
27+
}
28+
29+
public static void main(String[] args) {
30+
Solution solution = new Solution();
31+
TreeNode.print(solution.sortedArrayToBST(new int[]{0, 1, 2, 3, 4, 5, 6, 7}));
32+
}
33+
}

project/leetcode/src/com/blankj/structure/TreeNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class TreeNode {
1414
public TreeNode left;
1515
public TreeNode right;
1616

17-
TreeNode(int x) {
17+
public TreeNode(int x) {
1818
val = x;
1919
}
2020

0 commit comments

Comments
 (0)