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

中等 排序列表转换为二分查找树查看运行结果

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

lintcode——排序列表转换为二分查找树(链表,二叉排序树)的相关文章

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

题目 给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 解题 找到中间点,建立树的根结点 左右半边递归 注意: 右半边链表可以根据找到的中间节点进行递归 左半边要找到结束位置,这里我新建了一个链表 /** * Definition for ListNode. * public class ListNode { * int val; * ListNode next; * ListNode(int val) { * this.val = val; * this.next = n

LintCode-排序列表转换为二分查找树

给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 您在真实的面试中是否遇到过这个题? Yes 样例 标签 Expand 相关题目 Expand 分析:就是一个简单的递归,只是需要有些链表的操作而已 代码: /** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->

数据结构之二分查找树总结

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 二分查找树BST(也叫二叉查找树.二叉排序树)的提出是为了提供查找效率,之所以称为二分查找树,因为该二叉树对应着二分查找算法,查找平均的时间复杂度为o(logn),所以该数据结构的提出是为了提高查找效率. 定义 二分查找树或者是一棵空树,或者具有下列性质: 1.若它的左子树不为空,则左子树上所有结点的值均小于根结点的值: 2.若它的右子树不为空,则右子树上所有结点的值均大于根结点的值: 3.它的左右子树均为二分查找树. 操作 二分查找树的操作主

python几种排序算法和二分查找方法的实现

一.算法概念 - 含义:算法就是对问题进行处理且求解的一种实现思路或者思想. 评判程序优劣的方法 - 消耗计算机资源和执行效率(无法直观) 计算算法执行的耗时(不推荐,因为会受机器和执行环境的影响) 时间复杂度(推荐) 时间复杂度 - 评判规则:量化算法执行的操作/执行步骤的数量, - 如下列 def sumOfN(n): # 执行一步: theSum = 0 for i in range(1,n+1): # 下式一共执行n步,for循环不算一步,因为它是控制循环次数的 theSum = the

《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)

根据排序算法,可以解决一些小案例.举例如下: /* * 把字符串中的字符进行排序. * 举例:"dacgebf" * 结果:"abcdefg" * * 分析: * A:定义一个字符串 * B:把字符串转换为字符数组 * C:把字符数组进行排序 * D:把排序后的字符数组转成字符串 * E:输出最后的字符串 */ public class ArrayTest { public static void main(String[] args) { // 定义一个字符串 S

SPOJ TEMPLEQ - Temple Queues(二分查找+树状数组)

题意: 有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,000] 操作分为三种,1 A:表示在第A个队列加一个人. 2 X:表示求长度大于等于X队列数量.3 Y:表示所有长度大于等于Y的队列减去一个人. 题解: 把各个队列按长度排序 用差分数列来维护这个数组,这样求每个队列的长度就是求前缀和.每次求长度的复杂度是lgn,因为队列是按长度排序的,所以可以通过二分查找到

四种排序算法与二分查找

1. 冒泡排序 func BubbleSort(slice []int) []int { i, j, okay, count := 0, 0, true, len(slice) for i = 0; i < count-1; i++ { //最多需要进行count-1轮比较 okay = true for j = 0; j < count-i-1; j++ { //每一轮比较的逻辑 if slice[j] > slice[j+1] { slice[j], slice[j+1] = sli

二分查找树

//二叉查找树的定义,查询,插入,删除public class BSTree<T extends Comparable<T>>{ private BSTNode<T> mRoot;//定义根节点    //定义节点    private class BSTNode<T extends Comparable<T>>{        T key;        BSTNode<T> left; //左节点        BSTNode&l

1.一维数组:选择排序法、二分查找法; 2.二维数据:定义、引用、初始化,二维数组与矩阵。

5-1 输入一个正整数 n (1≤n≤10)和n 阶方阵a的元素,如果方阵a中的所有元素都沿主对角线对称,输出"Yes", 否则,输出"No".主对角线为从矩阵的左上角至右下角的连线,方阵a中的所有元素都沿主对角线对称指对所有i, k,a[i][k]和a[k][i]相等 一.实验代码 #include <stdio.h> int main(void) { int found, i, k, n; int a[10][10]; scanf ("%d