码迷,mamicode.com
首页 > 编程语言 > 详细

lintcode——排序列表转换为二分查找树(链表,二叉排序树)

时间:2015-09-18 18:07:23      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

中等 排序列表转换为二分查找树

 
27%
通过

给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树

 
您在真实的面试中是否遇到过这个题? 
Yes
样例
 
标签 Expand  

相关题目 Expand 

 

思路:

这道题将排好序的链表转化为二叉排序树,即左子树<根节点<右子树

采用递归的方法,在链表上选取中间点作为根节点,

每次传入的参数为,需要创建的根节点的指针(这里由于要改变指针的值,所以要传入指针的指针),链表开始指针,结尾指针,链表结点个数(

这里传入了个数之后,就不用再遍历整个来计算了,直接移动到n/2处来找中间结点)

 1 public:
 2     /**
 3      * @param head: The first node of linked list.
 4      * @return: a tree node
 5      */
 6      
 7      void banary_tree(ListNode* start,ListNode* end,TreeNode** root,int n)
 8      {
 9          if(start==end)
10          {
11              *root=new TreeNode(start->val);
12              return;
13          }
14          if(start->next==end)
15          {
16              *root=new TreeNode(end->val);
17              (*root)->left=new TreeNode(start->val);
18              return;
19          }
20          
21          ListNode* p1=start;
22          int step=n/2-1;
23          while(step--)
24          p1=p1->next;
25          
26          *root=new TreeNode(p1->next->val);
27          banary_tree(start,p1,&(*root)->left,n/2);
28          banary_tree(p1->next->next,end,&(*root)->right,n-n/2-1);
29      }
30      
31     TreeNode *sortedListToBST(ListNode *head) {
32         // write your code here
33         if(head==NULL)
34         return NULL;
35         TreeNode *ptr;
36         int len=1;
37         ListNode* ptr1=head;
38         while(ptr1->next!=NULL)
39         {
40             ptr1=ptr1->next;
41             len++;
42         }
43         banary_tree(head,ptr1,&ptr,len);
44         return ptr;
45     }
46 };

 

lintcode——排序列表转换为二分查找树(链表,二叉排序树)

标签:

原文地址:http://www.cnblogs.com/yanliang12138/p/4819768.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!