题目大意
给定一个有序链表,将其转变为一颗高度平衡的平衡二叉树
解题思路
让我们先回顾一下平衡二叉树的定义,在二叉平衡树的基础上其左右子树的最大深度不大于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;
}
};