leetcode : Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
使用分治的思想很好解决的问题。难点有两个,1如何建立平衡二叉搜索树,2,所给的单链表无法进行随机存储
考虑平衡二叉树的定义:
1.空树是平衡二叉树
2.左子树与右子树的高度之差不超过1,并且左右子树都是平衡二叉树
可以以buildTree(start,end)表示建立平衡二叉树的过程
buildBalancedTree(start,end)
if(start < end)
return null //空树是平衡二叉树
else
root = (start + end) / 2
root->left = buildBalancedTree(start,mid - 1) //左子树是平衡二叉树
root->right = buildBalancedTree(mid + 1, end) //右子树是平衡二叉树
return root
可以证明左右子树的高度差不超过1
对于任意偶数n
左子树有n/2-1个节点
右子树n/2个节点
相对的对n+1个节点执行该函数
左右子树都包含n/2个节点
问题转化为判断n/2-1个节点的情况与n/2个节点的情况所建立树高度是否相差1
显然用数学归纳法很容易证明高度差不超过1
即上面的算法建立的树一定是一颗平衡二叉树
下面解决链表无法随机存储的问题,很明显的,按照中根遍历的顺序遍历一颗二叉搜索树得到的遍历结果就是题中所给的链表的顺序
所以按照中根的顺序建立树即可以,下面是AC代码
class Solution { public: TreeNode *sortedListToBST(ListNode *head) { auto h = head; int len = 0; while(h){ ++len; h = h->next; } h = head; return buildTree(h,0,len - 1); } TreeNode *buildTree(ListNode *&head, int start, int end){ if(start > end) return NULL; int mid = (start + end) / 2; auto left = buildTree(head,start,mid - 1); //建立左子树 auto root = (TreeNode *)malloc(sizeof(TreeNode)); //建立根节点 root->val = head->val; root->left = left; head = head->next; auto right = buildTree(head, mid +1, end); //建立右子树 root->right = right; return root; } };
浙公网安备 33010602011771号