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. 将有序数组转换为二叉搜索树-快慢指针的主要内容,如果未能解决你的问题,请参考以下文章