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 };