建立一棵高度平衡的二叉树,第一想法肯定是选取链表的中点节点作为树根。然后发现在构造根的左右孩子孩子的时候,又是从左右两个链表中挑选链表中点节点的过程,是一个递归的过程。不借助其他辅助空间的话,只能是遍历寻找链表的中点。
挑选中点节点的过程可以用快慢指针完成,但是这种做法又需要注意一点,挑选出根节点以后,要把左半边链表,根前一个节点的next指针置空,否则递归过程中,根左子树就会挑不出正确的节点,构造就会出错。
TreeNode * sortedListToBST(ListNode * head) {
// write your code here
if(head == NULL) //根节点为空,直接返回NULL
return NULL;
if(head->next == NULL){ //链表中只有一个节点,构造成根返回
TreeNode* root = new TreeNode(head->val);
return root;
}
ListNode* before = head; //记录挑选出的根节点的前一个节点,方便后面将链表断开,然后递归
ListNode* slow = head->next;
ListNode* fast = head->next->next;
while(fast!=NULL && fast->next!=NULL){ //快慢指针遍历链表,挑选出中点节点,slow指向的节点
before = slow;
slow = slow->next;
fast = fast->next->next;
}
before->next = NULL; //断开根节点左边的链表
TreeNode* root = new TreeNode(slow->val); //构造树节点, 并递归构造左右子树
root->left = sortedListToBST(head);
root->right = sortedListToBST(slow->next);
return root;
}