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

 

posted on 2014-11-23 18:54  远近闻名的学渣  阅读(137)  评论(0)    收藏  举报

导航