题目:将非递减有序的链表转化为平衡二叉查找树!

参考的博客:http://blog.csdn.net/worldwindjp/article/details/39722643

利用递归思想:首先找到链表的中间节点,于是链表被分为了由该中间节点划分开来的两部分。递归地处理这两部分,最终便得到了平衡二叉查找树。

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 /**
10  * Definition for a binary tree node.
11  * struct TreeNode {
12  *     int val;
13  *     TreeNode *left;
14  *     TreeNode *right;
15  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
16  * };
17  */
18 class Solution {
19 public:
20     TreeNode* sortedListToBST(ListNode* head) {
21         if(!head)
22             return NULL;
23         if(head->next==NULL){
24             TreeNode*root=new TreeNode(head->val);
25             return root;
26         }
27         ListNode*pre=getLeftOfMid(head),*mid=pre->next;
28         TreeNode*root=new TreeNode(mid->val);//根
29         pre->next=NULL;
30         root->left=sortedListToBST(head);//左子树
31         root->right=sortedListToBST(mid->next);//右子树
32         return root;
33     }
34     ListNode* getLeftOfMid(ListNode*head)//说简单点,就是获取链表中间节点,作为树的根节点,并由此划分根的2个子树
35     {
36         if(!head)
37             return NULL;
38         ListNode*pre=head,*back=head;
39         while(back!=NULL)//back后退的步数大致是head的两倍,确保pre能落在中间节点位置的前一结点处
40         {
41             back=back->next;
42             if(!back)
43                 break;
44             back=back->next;
45             if(!back)
46                break;
47             pre=head;
48             head=head->next;
49         }
50         return pre;
51     }
52 };

上面的方法是一种自顶向下的方法,先找到root然后对左右子树分别递归调用。

网上又看到一种自底向上的方法,算法复杂度为O(N)。先递归构建左子树,在构建左子树的同时不断移动链表的头指针,链表的头指针永远是对应当前子树位置的。一直到左叶子节点,左叶子节点对应的就是链表的第一个元素,生成左叶子节点之后移动链表当前指针。

看这个博客:http://blog.csdn.net/linhuanmars/article/details/23904937

这里的问题是对于一个链表我们是不能常量时间访问它的中间元素的。这时候就要利用到树的中序遍历了,按照递归中序遍历的顺序对链表结点一个个进行访问,而我们要构造的二分查找树正是按照链表的顺序来的。思路就是先对左子树进行递归,然后将当前结点作为根,迭代到下一个链表结点,最后在递归求出右子树即可。整体过程就是一次中序遍历,时间复杂度是O(n),空间复杂度是栈空间O(logn)。

来看一下对应数组的中序遍历建立BST代码:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 private:
12      int cur;//不去掉这前面的static编译不会通过的
13 public:
14     TreeNode* sortedArrayToBST(vector<int>& nums) {
15         cur = 0;
16         if (nums.size() == 0)
17             return NULL;
18         return helper(nums, 0, nums.size() - 1);
19     }
20     TreeNode* helper(vector<int>&nums, int l, int r)
21     {
22         if (l > r)
23             return NULL;
24         int mid = (l+r) / 2;
25         TreeNode*left=helper(nums, l, mid-1);
26         TreeNode * root = new TreeNode(nums[cur++]);//回忆考研时候,中序遍历中,这个地方才是真正干活的语句(并且终须遍历二叉排序树得到的就是有序数组)
27         root->left = left;
28         root->right = helper(nums, mid + 1, r);
29         return root;
30     }
31 };

转载于:https://www.cnblogs.com/chess/p/4772031.html

Convert Sorted List to Balanced Binary Search Tree leetcode相关推荐

  1. Convert Sorted Array to Binary Search Tree - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Convert Sorted Array to Binary Search Tree - LeetCode 注意点 不要访问空结点 题目要求的是平衡二叉搜 ...

  2. balanced binary search tree

    2019独角兽企业重金招聘Python工程师标准>>> http://www.stathat.com/src/treap http://cxwangyi.wordpress.com/ ...

  3. [CareerCup] 4.5 Validate Binary Search Tree 验证二叉搜索树

    4.5 Implement a function to check if a binary tree is a binary search tree. LeetCode上的原题,请参见我之前的博客Va ...

  4. [CareerCup] 4.7 Lowest Common Ancestor of a Binary Search Tree 二叉树的最小共同父节点

    4.7 Design an algorithm and write code to find the first common ancestor of two nodes in a binary tr ...

  5. LeetCode: 109. Convert Sorted List to Binary Search Tree

    题目 Given a singly linked list where elements are sorted in ascending order, convert it to a height b ...

  6. leetcode -day19 Convert Sorted List to Binary Search Tree

    1.  Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted ...

  7. LeetCode: Convert Sorted Array to Binary Search Tree 解题报告

    Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...

  8. 【leetcode】109. Convert Sorted List to Binary Search Tree

    题目如下: Given a singly linked list where elements are sorted in ascending order, convert it to a heigh ...

  9. LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List--转换二叉树为双向链表--Java,C++,Python解法

    题目地址:Convert Binary Search Tree to Sorted Doubly Linked List - LeetCode Convert a BST to a sorted ci ...

最新文章

  1. 基于国密算法SM2SSL证书的https加密,如何实现?
  2. 光流 | OpenCV中的Lucas-Kanade光流与稠密光流:基于Opencv+Python(附代码)
  3. 再见IE浏览器(IE之死2021 年 8 月 17 日)
  4. C#多线程学习(三) 生产者和消费者
  5. Linux 手动安装Ettercap
  6. drill apache_如何使用Apache Drill分析高度动态的数据集
  7. LeetCode 1705. 吃苹果的最大数目(优先队列)
  8. vscode必备插件_10个必备的Visual Studio Code (VS code)插件
  9. python全栈要学什么_python全栈要学什么 python全栈学习路线
  10. 默纳克电梯系统服务器怎么操作,默纳克系统常见问题之六——电梯不运行
  11. 1,机器学习应用概述
  12. 利用后中遍历结果,重构二叉树
  13. 资管运营BAND原创 | 他山之石:境外基金业绩报酬计算方法(二)
  14. 休闲策略游戏源码荒野总动员H5+安卓+IOS三端源码
  15. java从以文件复制到另一文件_java将一个文件复制到另一个文件夹
  16. android 从服务器上获取APK下载安装
  17. java rest 知乎_JavaWeb开发之模仿知乎首页完整代码
  18. bitcode 是什么_secured是什么意思 Secured borrowings是什么意思
  19. Miscellaneous | 恭喜本人博客进入2万名以内,多谢各位支持!
  20. 2019年9月省市区/县SQL数据——第二篇

热门文章

  1. flex java blazeds_flex+java+blazeds 多通道好文
  2. python多线程并发每秒6000_Python多线程并发的误区
  3. java代码post接口请求 用 hutool工具类
  4. 16进制 dat matlab_MATLAB中的常量与变量
  5. cv_load_image_anycolor 什么意思_LOL英雄联盟手游use a ping什么意思?怎么给队友发信号?...
  6. python字典数据的特点_Python核心数据类型之字典15
  7. 如何使用Intellij IDEA工具导入SVN项目
  8. AngularJs的基础——$http请求数据
  9. python 文件行数_python—文件和数据(文件行数 文件字符分布)
  10. 北京大学生物信息学(8)