中等 排序列表转换为二分查找树查看运行结果
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 };
时间: 2024-10-09 16:16:27