有点没有完全想明白。
能够理解的点有:
1. 给你一个sorted list,用这里面的树构建bst,说明这个list是该bst的inorder遍历。
2. 给你的list相当于一个queue,每次用掉一个node就往后移动一格,相当于queue.poll();
3. 和之前那题serialize的题有点像,我当时选择的方式是preorder,这里是Inorder。但是那个里面叶节点会用#标记,这里没有#, 只能用一个start, end来标记,如果start>end那么就说明已经到叶节点了,返回空,所以建树的顺序是 left = 递归()=> 创建root => root.left = left => root.right = 递归另一半
1 private ListNode node; 2 public TreeNode sortedListToBST(ListNode head) { 3 if(head == null) { 4 return null; 5 } 6 int size = 0; 7 node = head; 8 ListNode cur = head; 9 while(cur != null) { 10 cur = cur.next; 11 size++; 12 } 13 return constructTree(0, size - 1); 14 } 15 16 private TreeNode constructTree(int start, int end) { 17 if(start > end) { 18 return null; 19 } 20 int mid = start + (end - start) / 2; 21 TreeNode left = constructTree(start, mid - 1); 22 TreeNode root = new TreeNode(node.val); 23 root.left = left; 24 node = node.next; 25 root.right = constructTree(mid + 1, end); 26 return root; 27 }
我觉得时间复杂度是O(n),因为node只走了一遍。
可以把serialize和deserialize用inorder再做一遍
时间: 2024-10-06 20:31:37