有序递增链表转化为平衡的二叉搜索树(LeetCode: Convert Sorted List to Binary Search Tree )
2015-01-27 15:47
525 查看
首先,这里是有序递增链表,那么链表的中间节点一定是二叉搜索树的根节点,左侧一半为左子树,右侧一半为右子树,这可以构建一个递归的过程。那么如何找到链表的中间节点呢?
方法1:将链表转化为vector(增加了额外的存储空间用来方便获取中间节点,构建递归过程)
方法2:二叉搜索树的中序遍历结果就是有序递增序列,可以利用中序遍历的方法将有序链表转成二叉搜索树,在遍历到树上的某一节点时,读取链表的值(没有额外分配内存,效率优于方法1)。
方法1:将链表转化为vector(增加了额外的存储空间用来方便获取中间节点,构建递归过程)
class Solution { public: TreeNode *sortedListToBST(ListNode *head) { if(head==NULL) return NULL; vector<int> vec; ListNode *current = head; while(current){ vec.push_back(current->val); current = current->next; } return constructTree(vec,0,vec.size()-1); } private: TreeNode *constructTree(vector<int> &vec,int start,int end){ if(start>end) return NULL; int mid = (start+end)/2; TreeNode *root = new TreeNode(vec[mid]); root->left = constructTree(vec,start,mid-1); root->right = constructTree(vec,mid+1,end); return root; } };
方法2:二叉搜索树的中序遍历结果就是有序递增序列,可以利用中序遍历的方法将有序链表转成二叉搜索树,在遍历到树上的某一节点时,读取链表的值(没有额外分配内存,效率优于方法1)。
class Solution { public: TreeNode *sortedListToBST(ListNode *head) { if(head==NULL) return NULL; ListNode *current = head; int len = 1; while(current=current->next) ++len; return inOrder(head,0,len-1); } private: TreeNode *inOrder(ListNode *&head,int left,int right){//这里需要使用指针的引用 if(left>right) return NULL; int mid = (left+right)/2; TreeNode *root = new TreeNode(0); root->left = inOrder(head,left,mid-1); root->val = head->val; head = head->next; root->right = inOrder(head,mid+1,right); return root; } };
相关文章推荐
- Convert Sorted List to Binary Search Tree (递增的链表转化成高度平衡的二叉查找树)【leetcode】
- Leetcode 109 Convert Sorted List to Binary Search Tree 有序单链表构造平衡二插查找树
- [LeetCode] Convert Binary Search Tree to Sorted Doubly Linked List 将二叉搜索树转为有序双向链表
- LeetCode OJ 之 Convert Sorted List to Binary Search Tree(把有序链表转化为二叉搜索树)
- Leetcode Convert Sorted List to Binary Search Tree 把有序链表转换成二叉搜索树
- [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树
- [C++]LeetCode: 106 Convert Sorted List to Binary Search Tree (有序链表转AVL树)
- [leetcode]Convert Sorted Array to Binary Search Tree (有序数组转化为二叉搜索树 C语言)
- [LeetCode 109] - 将已排序链表转换为二叉搜索树 (Convert Sorted List to Binary Search Tree)
- [Leetcode] Convert sorted list to binary search tree 将排好的链表转成二叉搜索树
- Convert Sorted List to Binary Search Tree 把有序链表转为BST@LeetCode
- LeetCode | 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---Convert Sorted List to Binary Search Tree---二叉搜索树
- 【LeetCode笔记】Convert Sorted Array to Binary Search Tree 通过有序数列建立二叉搜索树
- Convert Sorted Array to Binary Search Tree (递增数组建高度平衡的二叉查找树)【leetcode】
- Leetcode 108 Convert Sorted Array to Binary Search Tree 有序数组构造平衡二叉查找树
- LeetCode 108. Convert Sorted Array to Binary Search Tree (有序数组转化为二叉搜索树)
- [LeetCode] Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树