Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
输入: head = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。 二、思路分析:
哈哈昨天的让把树变成链状,今天就让我们把链表变成树状(所以逆转过来就叫结构数据了。。。),思路也是比较简单,首先就是找到链表的中间节点,那么这里最常用的方法就是快慢指针,快指针一次走两步,慢指针一次走一步,这样最终慢指针指向的就是链表的中间节点,然后我们需要把链表断开,这里需要注意的是,你需要保留慢指针的前一个值,确保你前半段的链表不包含你刚才的根节点了,然后递归的处理前后链表就可以了。
- 如果传入的链表已经为空,那么直接返回null就可以了
- 如果传入的链表只有一个节点,那么返回一个左右子树都为空的根节点就可以了。
- 不是以上情况的,用快慢指针找到中间节点。
- 递归处理前后链表就行了
三、AC 代码:
代码一:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {ListNode} head
* @return {TreeNode}
*/
var sortedListToBST = function(head) {
if(!head){
return null;
}
if(!head.next){
return new TreeNode(head.val);
}
let pre=head,low=pre.next,fast=low.next;
while(fast&&fast.next){
fast=fast.next.next;
low=low.next;
pre=pre.next;
}
let root=new TreeNode(low.val);
let tem=low.next;
pre.next=null;
root.left=sortedListToBST(head);
root.right=sortedListToBST(tem);
return root;
};
四、总结:
现在递归的方法已经悟了:理解递归的本质, 千万别尝试去实现递归过程,大脑不是堆栈,层数一多,脑子就会瓦特了。 so,最简单的方法就是,你假设函数已经具备该功能,然后考虑输入、输出就行了。