108. 将有序数组转换为二叉搜索树-快慢指针

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了108. 将有序数组转换为二叉搜索树-快慢指针相关的知识,希望对你有一定的参考价值。

一、题目描述

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 1:

二、解题

递归

由于该数组是有序的,所以是从中间开始遍历,递归。


class Solution 
    public TreeNode sortedArrayToBST(int[] nums) 
        //由于每个节点的左右两个子树的高度差的绝对值不超过1。所以从中间开始分割 递归实现
        return inorder(nums,0,nums.length-1);
    
    public TreeNode inorder(int[] nums,int left,int right)
        if(left>right)
            return null;
        
        int mid = left+(right - left) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = inorder(nums,left,mid-1);
        root.right = inorder(nums,mid+1,right);
        return root;
    

快慢指针

还可以对有序链表使用快慢指针,然后找到中间节点,递归执行。

class Solution 
    public TreeNode sortedListToBST(ListNode head) 
        //使用递归 快慢指针,这样效率会高一点
        return inorder(head);
    
    public TreeNode inorder(ListNode head)
        //若当前节点为空 直接返回
        if(head == null)
            return null;
        
        //若递归到只有一个节点时 ,无法进行快慢指针,则直接返回当前节点值。
        if(head.next == null)
            return new TreeNode(head.val);
        
        //找到中间节点
        ListNode premid = getmid(head);
        ListNode mid = premid.next;
        premid.next = null;
        TreeNode node = new TreeNode(mid.val);
        node.left = inorder(head);
        node.right = inorder(mid.next);
        return node;
    

    public ListNode getmid(ListNode head)
        ListNode slow = head,fast = head;
        //保存慢节点的前一个节点
        ListNode pre = head;
        while(fast != null && fast.next != null)
            pre = slow;
            slow = slow.next;
            fast = fast.next.next;
        
        return pre;
    

以上是关于108. 将有序数组转换为二叉搜索树-快慢指针的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 108. 将有序数组转换为二叉搜索树

Leetcode 108 将有序数组转换为二叉搜索树

LeetCode 108. 将有序数组转换为二叉搜索树 | Python

LeetCode(108):将有序数组转换为二叉搜索树

LeetCode 108. 将有序数组转换为二叉搜索树

LeetCode-108. 将有序数组转换为二叉搜索树