[C++]LeetCode: 106 Convert Sorted List to Binary Search Tree (有序链表转AVL树)
2015-01-17 18:52
501 查看
题目:Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced
BST.
思路:
这道题的解题思路和Convert
Sorted Array to Binary Search Tree (AVL树)一样。我们也是找到有序链表的中间节点作为根,将有序链表分为两部分,再分别在左右两部分寻找中间节点作为根,递归下去构建AVL树。针对链表,我们不能通过坐标直接得到中间值,需要遍历链表,找到中间元素。创建辅助函数,TreeNode* sortedListToBST_helper(ListNode* head, int len), 参数len表示链表的长度。我们通过计算从头结点到中间节点的步数,来遍历链表,找到中间节点。递归终止条件,len
<= 0.
Attention:
1. 一定要注意while 和if,不要顺手就写if.
ERROR:
mid:表示从头节点到中间节点的节点个数(包括中间节点)(mid = (len+1)/2);
i : 表示头结点到中间节点的步数(i = mid -1);
3. 注意下次递归的头结点和链表长度设置。
AC Code:
这道题也可以利用Convert Sorted Array to Binary Search
Tree (AVL树)中设置start和end来做;也可以先把list转成数组来做。
BST.
思路:
这道题的解题思路和Convert
Sorted Array to Binary Search Tree (AVL树)一样。我们也是找到有序链表的中间节点作为根,将有序链表分为两部分,再分别在左右两部分寻找中间节点作为根,递归下去构建AVL树。针对链表,我们不能通过坐标直接得到中间值,需要遍历链表,找到中间元素。创建辅助函数,TreeNode* sortedListToBST_helper(ListNode* head, int len), 参数len表示链表的长度。我们通过计算从头结点到中间节点的步数,来遍历链表,找到中间节点。递归终止条件,len
<= 0.
Attention:
1. 一定要注意while 和if,不要顺手就写if.
ERROR:
if(p->next != NULL) { p = p->next; len++; }2. len:表示链表的长度;
mid:表示从头节点到中间节点的节点个数(包括中间节点)(mid = (len+1)/2);
i : 表示头结点到中间节点的步数(i = mid -1);
3. 注意下次递归的头结点和链表长度设置。
root->left = sortedListToBST_helper(head, mid - 1); root->right = sortedListToBST_helper(midp->next, len - mid);复杂度:AVL树总共有lgN层,每层递归调用需要遍历N/2个元素,遍历链表,找到中间元素,将该元素作为根结点时间复杂度为O(Nlg(N))
AC Code:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *sortedListToBST(ListNode *head) {
if(head == NULL) return NULL;
ListNode* p = head;
int len = 1;
while(p->next != NULL)
{
p = p->next;
len++;
}
return sortedListToBST_helper(head, len);
}
private:
TreeNode* sortedListToBST_helper(ListNode* head, int len)
{
if(len <= 0)
return NULL;
int mid = (len + 1) /2; //计算从头结点到中间节点的有多少个节点(包含中间节点)
ListNode* midp = head;
//找到中间节点
int i = mid - 1;
while(i > 0)
{
midp = midp->next;
i--;
}
TreeNode* root = new TreeNode(midp->val);
root->left = sortedListToBST_helper(head, mid - 1); root->right = sortedListToBST_helper(midp->next, len - mid);
return root;
}
};
这道题也可以利用Convert Sorted Array to Binary Search
Tree (AVL树)中设置start和end来做;也可以先把list转成数组来做。
相关文章推荐
- Leetcode Convert Sorted List to Binary Search Tree 把有序链表转换成二叉搜索树
- Leetcode 109 Convert Sorted List to Binary Search Tree 有序单链表构造平衡二插查找树
- 有序递增链表转化为平衡的二叉搜索树(LeetCode: Convert Sorted List to Binary Search Tree )
- leetcode_c++:链表:Convert Sorted List to Binary Search Tree(109)
- Convert Sorted List to Binary Search Tree 把有序链表转为BST@LeetCode
- [LeetCode] Convert Binary Search Tree to Sorted Doubly Linked List 将二叉搜索树转为有序双向链表
- [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树
- LeetCode刷题(C++)——Convert Sorted List to Binary Search Tree(Normal)
- LeetCode Convert Sorted List to Binary Search Tree(有序单链表转为平衡二叉树)
- Convert Sorted List to Binary Search Tree (递增的链表转化成高度平衡的二叉查找树)【leetcode】
- 【leetcode】【单链表】【109】Convert Sorted List to Binary Search Tree
- [C++]LeetCode: 100 Convert Sorted Array to Binary Search Tree (AVL树)
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
- LeetCode刷题笔记(链表):convert-sorted-list-to-binary-search-tree
- LeetCode | Convert Sorted List to Binary Search Tree(链表转换成二叉搜索树)
- 【leetcode】【单链表】【109】Convert Sorted List to Binary Search Tree
- [LeetCode 109] - 将已排序链表转换为二叉搜索树 (Convert Sorted List to Binary Search Tree)
- [Leetcode] Convert sorted list to binary search tree 将排好的链表转成二叉搜索树
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
- LeetCode OJ 之 Convert Sorted List to Binary Search Tree(把有序链表转化为二叉搜索树)