当前位置: 首页 > 后端技术 > Java

LeetCode-109-有序链表转换二叉搜索树

时间:2023-04-02 02:03:13 Java

OrderedLinkedList转换二叉搜索树题目描述:给定一个元素按升序排列的单向链表,将其转换成一棵高度平衡的二叉搜索树。本题中,高度平衡二叉树是指一棵二叉树的每个节点的左右子树高度差的绝对值不超过1。例子见LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。方案一:递归首先将链表转化为数组,然后处理过程与LeetCode-108-ConvertinganOrderedArrayintoaBinarySearchTree的方案完全一样。根据二叉搜索树的性质,由于给定的数组是按升序排列的,因此可以确定数组num是二叉搜索树的中序遍历序列。为了得到一棵平衡二叉树,取数组中间位置的节点作为根节点。这样左右子树的节点就比较平衡了。具体处理过程如下:调用递归方法,初始起始位置为数组长度;当起始位置大于结束位置时,表示遍历该节点,直接返回空树;取中间位置的值作为根节点,使得左右子树的节点树比较平衡;然后递归获取当前根节点的左右子树;最后返回根节点作为平衡二叉搜索树。importcom.kaesar.leetcode.ListNode;importcom.kaesar.leetcode.TreeNode;importjava.util.LinkedList;importjava.util.Queue;publicclassLeetCode_109{publicstaticTreeNodesortedListToBST(ListNodehead){Queue队列=新链表<>();while(head!=null){queue.add(head.val);head=head.next;}int[]nums=newint[queue.size()];整数索引=0;//先把链表转成数组,就是二叉树的中序遍历序列while(!queue.isEmpty()){nums[index++]=queue.poll();}//调用递归方法,初始位置为数组的长度returnsortedListToBST(nums,0,nums.length-1);}/***递归**@paramnums*@paramleft*@paramright*@return*/privatestaticTreeNodesortedListToBST(int[]nums,intleft,intright){//当起始位置大于结束位置,表示遍历该节点,直接返回空树if(left>right){returnnull;}//获取中间位置的值作为根节点,这样左右子树的节点树是一个比较平衡的点intmid=(left+right)/2;TreeNoderoot=newTreeNode(nums[mid]);//然后递归获取当前根节点的左右子树root.left=sortedListToBST(nums,left,mid-1);root.right=sortedListToBST(nums,mid+1,right);返回根;}publicstaticvoidmain(String[]args){ListNodehead=newListNode(-10);head.next=newListNode(-3);head.next.next=newListNode(-0);head.next.next.next=newListNode(5);head.next.next.next.next=newListNode(9);sortedListToBST(head).print();}}【每日留言】无铁无金,必有可磨砚;每日磨刀,从来没有锋利的针