结构数据你真的稳了嘛

58 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

给定一个单链表的头节点  head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

image.png

输入: 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,最简单的方法就是,你假设函数已经具备该功能,然后考虑输入、输出就行了。