leetcode链表--2、排序链表转平衡二叉树

题目描述
 
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
 
题目描述
给定一个升序排列的有序单链表,将其转换为一棵平衡的二叉搜索树。
 
二叉树搜索:对于所有节点,顺序是:left children <= current node <= right children;
平衡vs.非平衡:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树;
 
思路如下:
由于二叉排序树的中序遍历即有序,也就是与本题中的单链表从头到尾遍历相同,所以可以按照类似中序遍历的做法。首先使用快慢指针找到应该的二叉搜索树的根节点。然后递归构建左右子树。
 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 binary tree
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     //找到位于中间的根节点,返回
20     ListNode *cutAtMid(ListNode *head)
21     {
22         if(head == NULL)
23             return NULL;
24         ListNode *fast = head;
25         ListNode *slow = head;
26         //pre指针的目的是把链表断开,保证slow前为一个链表,slow后为一个链表
27         //使得在递归的时候求左子树时,head就为头到slow前一个
28         ListNode* pre = NULL;//此处如果没有pre指针会出现段错误??
29         while(fast!=NULL && fast->next != NULL)
30         {
31             pre = slow;  
32             slow = slow->next;
33             fast = fast->next->next;
34         }
35         pre->next = NULL;
36          
37         return slow;
38     }
39 public:
40     TreeNode *sortedListToBST(ListNode *head)
41     {
42         if(head == NULL)
43         {
44             return NULL;
45         }
46  
47         if(head->next == NULL) {
48             return new TreeNode(head->val);
49         }
50  
51         ListNode *mid = cutAtMid(head);
52  
53         TreeNode *root = new TreeNode(mid->val);
54         root->left = sortedListToBST(head);//递归构建左右子树
55         root->right = sortedListToBST(mid->next);
56  
57         return root;
58     }
59 };

 

posted @ 2017-04-28 15:20  qqky  阅读(708)  评论(0编辑  收藏  举报