Convert Sorted Array & List to Binary Search Tree

(1) Convert Sorted Array to Binary Search Tree

根据[1],因为已经排好序,所以每次将中间节点作为根节点(保证为平衡树)。

class Solution {
private:
    void buildBST(vector<int> &num, TreeNode * &root, int begin, int end){
        if(begin>end)
            return;
        
        int mid=(begin+end)/2;
        
        root=new TreeNode(num[mid]);
        
        buildBST(num,root->left,begin,mid-1);
        buildBST(num,root->right,mid+1,end);
        
    }

public:
    TreeNode *sortedArrayToBST(vector<int> &num) {
        
        TreeNode *root=NULL;
        
        if(num.size()>0)
            buildBST(num,root,0,num.size()-1);
        return root;
    }
};
注意buildBST第二个参数需要用引用的指针,不然可能返回为NULL。


(2) Convert Sorted List to Binary Search Tree
根据[2],这题的关键是能找出当前链表的中间节点,然后再递归左右的子链表,开始的时候程序先计算链表总厂,然后传入两个前后索引指针,最后每次递归找出中间节点即可。

class Solution {
private:
    TreeNode *buildBST(ListNode *root, int begin, int end){
        if(begin>end)
            return NULL;
        
        int mid=(begin+end)/2;
        
        ListNode *p=root;
        
        for(int i=begin;i<mid;i++)
            p=p->next;
            
        TreeNode* left=buildBST(root,begin,mid-1);
        TreeNode* right=buildBST(p->next,mid+1,end);
        
        TreeNode* ret=new TreeNode(p->val);
        
        ret->left=left;
        ret->right=right;
        
        return ret;
    }

public:
    TreeNode *sortedListToBST(ListNode *head) {
        
         int len = 0;
         ListNode *node=head;
         while(node)
         {
            len++;
            node = node->next;
         }
        return buildBST(head,0,len-1);
    }
};

参考:

[1] http://jiyuede.blog.163.com/blog/static/332519212012112023814496/

[2] http://www.cnblogs.com/remlostime/archive/2012/10/29/2744805.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值