package LeetC;
public class LTTestNetbeans {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
LTTestNetbeans test = new LTTestNetbeans();
ListNode head = test.buildList();
test.sortedListToBST(head);
}
ListNode curr;
public TreeNode sortedListToBST(ListNode head) {
curr = head;
int len = 0;
// 先计算出链表的长度
while (head != null) {
head = head.next;
len++;
}
// 开始建树
return buildTree(0, len - 1);
}
private TreeNode buildTree(int start, int end) {
// 如果start>end,说明子树已经小到没有节点了,直接返回null
if (start > end) {
return null;
}
// 找到中点
int mid = start + (end - start) / 2;
// 先递归的计算左子树
TreeNode left = buildTree(start, mid - 1);
// 然后建立根节点
TreeNode root = new TreeNode(curr.val);
// 链表顺序遍历
curr = curr.next;
// 最后计算右子树
TreeNode right = buildTree(mid + 1, end);
// 将三个节点连接起来
root.left = left;
root.right = right;
return root;
}
private ListNode buildList(){
ListNode node0 = new ListNode(0);
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
ListNode node6 = new ListNode(6);
node0.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
return node0;
}
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
}
refer: https://segmentfault.com/a/1190000003816154