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

来源:互联网 发布:cpu 编程 英语 编辑:程序博客网 时间:2024/06/10 12:34

题目大意

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

解题思路

    让我们先回顾一下平衡二叉树的定义,在二叉平衡树的基础上其左右子树的最大深度不大于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;    }};

0 0
原创粉丝点击