當(dāng)前位置:
首頁(yè) >
leetcode109. 有序链表转换二叉搜索树(深度优先搜索/快慢指针)
發(fā)布時(shí)間:2023/11/29
36
豆豆
生活随笔
收集整理的這篇文章主要介紹了
leetcode109. 有序链表转换二叉搜索树(深度优先搜索/快慢指针)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
給定一個(gè)單鏈表,其中的元素按升序排序,將其轉(zhuǎn)換為高度平衡的二叉搜索樹。
本題中,一個(gè)高度平衡二叉樹是指一個(gè)二叉樹每個(gè)節(jié)點(diǎn) 的左右兩個(gè)子樹的高度差的絕對(duì)值不超過(guò) 1。
解題思路
先將鏈表轉(zhuǎn)換成數(shù)組,再構(gòu)造二叉搜索樹
代碼
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/ /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/ class Solution {public TreeNode sortedListToBST(ListNode head) {ArrayList<Integer> list=new ArrayList<>();while (head!=null){list.add(head.val);head= head.next;}int[] k=new int[list.size()];for(int c=0;c<k.length;c++)k[c]=list.get(c);return sortedArrayToBST(k);}public TreeNode sortedArrayToBST(int[] nums) {if(nums.length==0) return null;return BST(nums,0,nums.length-1);}public TreeNode BST(int[] nums,int left,int right) {if(left>right) return null;if(left==right) return new TreeNode(nums[left]);int mid=left+((right-left)>>1);TreeNode treeNode=new TreeNode(nums[mid]);treeNode.right=BST(nums,mid+1,right);treeNode.left=BST(nums,left,mid-1);return treeNode;} }解題思路
通過(guò)快慢指針找鏈表的中點(diǎn),進(jìn)行遞歸
代碼
class Solution {public TreeNode sortedListToBST(ListNode head) {if(head==null) return null;return helper(head,null);}public TreeNode helper(ListNode head,ListNode tail) {if(head==tail) return null;ListNode slow=head,fast=head;while (fast!=tail&&fast.next!=tail){fast=fast.next.next;slow=slow.next;}TreeNode treeNode=new TreeNode(slow.val);treeNode.right=helper(slow.next,tail);treeNode.left=helper(head,slow);return treeNode;} }總結(jié)
以上是生活随笔為你收集整理的leetcode109. 有序链表转换二叉搜索树(深度优先搜索/快慢指针)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怀孕梦到枣子是什么意思
- 下一篇: 梦到自卑什么意思