-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathSolution.java
130 lines (113 loc) · 3.39 KB
/
Solution.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package ds.bst.leetcode109;
import java.util.ArrayDeque;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* 有序链表转换二叉搜索树
* LeetCode 109 https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/
*
* @author yangyi 2022年04月22日11:49:00
*/
public class Solution {
public static class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public TreeNode sortedListToBST(ListNode head) {
return buildTree(head, null);
}
private TreeNode buildTree(ListNode start, ListNode end) {
if (start == end) {
return null;
}
ListNode mNode = getLinkMiddle(start, end);
TreeNode root = new TreeNode(mNode.val);
root.left = buildTree(start, mNode);
root.right = buildTree(mNode.next, end);
return root;
}
private ListNode getLinkMiddle(ListNode start, ListNode end) {
ListNode fast = start;
ListNode slow = start;
while (fast != end && fast.next != end) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
private List<List<TreeNode>> levelOrder(TreeNode root) {
if (root == null) {
return new LinkedList<>();
}
List<List<TreeNode>> result = new LinkedList<>();
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<TreeNode> level = new LinkedList<>();
for (int i = 0; i < size; i++) {
TreeNode cur = queue.poll();
if (cur != null) {
level.add(cur);
}
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
result.add(level);
}
return result;
}
private ListNode createListNode() {
ListNode val_10 = new ListNode(-10);
ListNode val_3 = new ListNode(-3);
ListNode val_0 = new ListNode(0);
ListNode val_5 = new ListNode(5);
ListNode val_9 = new ListNode(9);
val_10.next = val_3;
val_3.next = val_0;
val_0.next = val_5;
val_5.next = val_9;
return val_10;
}
public static void main(String[] args) {
Solution solution = new Solution();
ListNode link = solution.createListNode();
TreeNode tree = solution.sortedListToBST(link);
List<List<TreeNode>> result = solution.levelOrder(tree);
for (List<TreeNode> treeNodes : result) {
for (TreeNode treeNode : treeNodes) {
System.out.print(treeNode.val + " ");
}
System.out.println();
}
}
}