Convert Sorted List to Binary Search Tree ---请叫我变形金刚(please call me a transformer)

题目大意

     给定一个有序链表,将其转变为一颗高度平衡的平衡二叉树

解题思路

    让我们先回顾一下平衡二叉树的定义,在二叉平衡树的基础上其左右子树的最大深度不大于1。既然给定的字符串是有序的,那我们从中点开始向左右依次构建,即使用递归一直重复:找中位数,构造左子树,构造右子树的过程,必然就能很理想地构建出一棵完全平衡二叉树。

总结

      题目不难,思路也很清晰,注意写测试的时候,构造链表时别先将cur移动到下一个节点后再申请空间,这样的话就是是先移动到NULL然后再申请空间,而NULL是一个固定的地址,因此无法保证链表的连接性,但在函数里面用递归建立链表这样是可以的,原因就在这里

http://blog.csdn.net/zhang360896270/article/details/40484827。另外还要注意使用快慢指针时要一直判断是否当前为空,因为空指针是没有next域的,故会出错

代码

   

class Solution {
public:
    ListNode *getMiddle(ListNode *head, ListNode *tail)
    {
             ListNode *f_cur = head;
             ListNode *l_cur = head;
             while (f_cur != tail){
                   f_cur = f_cur->next;
                   if (f_cur == tail)break;
                   f_cur = f_cur->next;
                   if (f_cur == tail)break;
                   l_cur = l_cur->next;
             }         
             return l_cur;
    }
    void reModi(TreeNode *&cur, ListNode *left, ListNode *right)
    {
         if (left == right)return ;
         ListNode *mid = getMiddle(left, right);
         cur = new TreeNode(mid->val);
         reModi(cur->left, left, mid);
         reModi(cur->right, mid->next, right);
    }
    TreeNode *sortedListToBST(ListNode *head) 
    {
             TreeNode *root = NULL;
             reModi(root, head, NULL);
             return root;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值