博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode | Convert Sorted List to Binary Search Tree
阅读量:6336 次
发布时间:2019-06-22

本文共 2365 字,大约阅读时间需要 7 分钟。

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

top-down还是o(nlgn)。自己没有细想,不过查了一下,发现还是有o(n)的,用的是bottom-up. 

The bottom-up approach enables us to access the list in its order while creating nodes. Each time you are stucked with the top-down approach, give bottom-up a try. Although bottom-up approach is not the most natural way we think, it is extremely helpful in some cases. However, you should prefer top-down instead of bottom-up in general, since the latter is more difficult to verify in correctness.

top down:

1 class Solution { 2 public: 3     TreeNode *sortedListToBST(ListNode *head) { 4         if (head == NULL) return NULL; 5         ListNode* slow = head, *fast = head, *pre = NULL; 6         while(slow != NULL && fast != NULL && fast->next != NULL) { 7             pre = slow; 8             slow = slow->next; 9             fast = fast->next->next;10         }11         12         TreeNode* root = new TreeNode(slow->val);13         14         TreeNode* left = NULL;15         if (pre != NULL) {16             pre->next = NULL;17             left = sortedListToBST(head);18         } 19         20         TreeNode* right = sortedListToBST(slow->next);21         22         root->left = left;23         root->right = right;24         25         return root;26     }27 };

bottom up:

1 class Solution { 2 public: 3     TreeNode *sortedListToBST(ListNode *head) { 4         int n = 0;  5         ListNode* p = head; 6         while (p != NULL) { 7             n++; 8             p = p->next; 9         }10         return recursive(head, 0, n - 1);11     }12     13     TreeNode* recursive(ListNode* &head, int start, int end) {14         if (head == NULL) return NULL;15         if (start > end) return NULL;16         int mid = start + (end - start) / 2;17         TreeNode* left = recursive(head, start, mid - 1);18         TreeNode* root = new TreeNode(head->val);19         head = head->next;20         TreeNode* right = recursive(head, mid + 1, end);21         root->left = left;22         root->right = right;23         return root;24     }25 };

首先是要得到整个list的长度,有了这个长度才能知道最终的BST是什么样子的。然后是先用左边的元素完成左边的子树构建,要确保构建完之后,list的head指针必须更新到末尾。所以这里需要传引用,ListNode*&。整个算法复杂度为o(n)。

另一种做法:

既然知道长度之后就知道最终的BST是什么样子的,那么可以先构建一颗空树。然后inorder traversal填进去就可以。

转载于:https://www.cnblogs.com/linyx/p/3663738.html

你可能感兴趣的文章
今天的学习
查看>>
面试必问之JVM原理
查看>>
mysql主主同步+Keepalived
查看>>
java位移运算符 转
查看>>
转:strcpy实现的考察要点
查看>>
【转】Map/Reduce简介
查看>>
LOB
查看>>
js验证姓名和身份证号
查看>>
Solr空格默认值是AND还是OR
查看>>
(转)SQL SERVER 生成建表脚本
查看>>
对 Java Integer.valueOf() 的一些了解
查看>>
253:Cube painting
查看>>
2016 年 Java 工具和技术的调查:IDEA 已超过
查看>>
Robot Framework学习笔记(十)------Selenium2Library库
查看>>
openssl 自建CA签发证书 网站https的ssl通信
查看>>
18、jmeter对数据库进行压力测试
查看>>
19、Linux命令对服务器内存进行监控
查看>>
springmvc中的字典表
查看>>
iterator的使用和封个问题
查看>>
mac 安装php mongo扩展,无法使用的解决办法
查看>>