经典面试题:将有序数组、有序链表转换成平衡二叉树
微信搜一搜:bigsai
大家都在關(guān)注的刷題、學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法寶藏項(xiàng)目
關(guān)注回復(fù)進(jìn)群即可加入力扣打卡群,歡迎劃水。
將有序數(shù)組轉(zhuǎn)換成平衡二叉樹
將一個(gè)按照升序排列的有序數(shù)組,轉(zhuǎn)換為一棵高度平衡二叉搜索樹。
本題中,一個(gè)高度平衡二叉樹是指一個(gè)二叉樹每個(gè)節(jié)點(diǎn) 的左右兩個(gè)子樹的高度差的絕對(duì)值不超過 1。
示例:
給定有序數(shù)組: [-10,-3,0,5,9],
一個(gè)可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個(gè)高度平衡二叉搜索樹:
0/ \-3 9/ /-10 5分析
對(duì)于二叉平衡樹來說,我們知道它的中序序列是一個(gè)升序序列,剛好和我們的給定的升序數(shù)組是一致的。而數(shù)組反向構(gòu)造一個(gè)二叉平衡樹,如果從左向右一個(gè)個(gè)構(gòu)造、旋轉(zhuǎn)那樣的話代價(jià)太大了,所以這道題我們根據(jù)數(shù)組的特征去構(gòu)造一棵二叉平衡樹。
二叉平衡樹的左右高度之差小于等于1,那么我們每次按照這個(gè)策略構(gòu)造即可完成一個(gè)二叉平衡樹:每次選取待構(gòu)造的中間節(jié)點(diǎn)當(dāng)成根節(jié)點(diǎn),然后遞歸的將左右兩個(gè)區(qū)域按照同樣方法構(gòu)造。
具體實(shí)現(xiàn)的代碼為:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/ class Solution {public TreeNode sortedArrayToBST(int[] nums) {return sortedArrayToBST(nums,0,nums.length-1);}private TreeNode sortedArrayToBST(int[] nums, int start,int end) {if(nums.length==0||start>end)return null;int mid=(start+end)/2;TreeNode node=new TreeNode(nums[mid]);node.left=sortedArrayToBST(nums, start, mid-1);node.right=sortedArrayToBST(nums, mid+1, end);return node;} }將有序鏈表轉(zhuǎn)換為二叉平衡樹
給定一個(gè)單鏈表,其中的元素按升序排序,將其轉(zhuǎn)換為高度平衡的二叉搜索樹。
本題中,一個(gè)高度平衡二叉樹是指一個(gè)二叉樹每個(gè)節(jié)點(diǎn) 的左右兩個(gè)子樹的高度差的絕對(duì)值不超過 1。
示例:
給定的有序鏈表: [-10, -3, 0, 5, 9],一個(gè)可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個(gè)高度平衡二叉搜索樹:0/ \-3 9/ /-10 5分析:
這道題的核心思路和有序數(shù)組的轉(zhuǎn)換成平衡二叉樹差不多,但是鏈表的弱點(diǎn)就是查詢效率,當(dāng)然你可以先枚舉一遍鏈表然后轉(zhuǎn)換成數(shù)組轉(zhuǎn)換成二叉平衡樹的問題,和上一題的思路相同,但是這里的話就是用一個(gè)快慢指針進(jìn)行查找。
當(dāng)然,每次找到中間節(jié)點(diǎn)的時(shí)候同樣需要將鏈表分成兩部分,這樣我事先將慢指針設(shè)置一個(gè)前驅(qū)節(jié)點(diǎn)在操作的時(shí)候更容易拆分成兩個(gè)部分。
具體的代碼為:
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/ /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/ class Solution {public TreeNode sortedListToBST(ListNode head) {if(head==null)return null;if(head.next==null)return new TreeNode(head.val);ListNode fast=head;ListNode slow=new ListNode(0);slow.next=head;while(fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;}TreeNode node=new TreeNode(slow.next.val);node.right=sortedListToBST(slow.next.next);slow.next=null;node.left=sortedListToBST(head);return node;} }原創(chuàng)不易,bigsai請(qǐng)你幫兩件事幫忙一下:
star支持一下, 您的肯定是我在平臺(tái)創(chuàng)作的源源動(dòng)力。
微信搜索「bigsai」,關(guān)注我的公眾號(hào),不僅免費(fèi)送你電子書,我還會(huì)第一時(shí)間在公眾號(hào)分享知識(shí)技術(shù)。加我還可拉你進(jìn)力扣打卡群一起打卡LeetCode。
記得關(guān)注、咱們下次再見!
總結(jié)
以上是生活随笔為你收集整理的经典面试题:将有序数组、有序链表转换成平衡二叉树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经典面试题:给两个序列如何构造一棵二叉树
- 下一篇: 经典笔试题: 二叉树中和为某一值的路径(