经典面试题:将有序数组、有序链表转换成平衡二叉树
微信搜一搜:bigsai
大家都在關注的刷題、學習數據結構和算法寶藏項目
關注回復進群即可加入力扣打卡群,歡迎劃水。
將有序數組轉換成平衡二叉樹
將一個按照升序排列的有序數組,轉換為一棵高度平衡二叉搜索樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定有序數組: [-10,-3,0,5,9],
一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜索樹:
0/ \-3 9/ /-10 5分析
對于二叉平衡樹來說,我們知道它的中序序列是一個升序序列,剛好和我們的給定的升序數組是一致的。而數組反向構造一個二叉平衡樹,如果從左向右一個個構造、旋轉那樣的話代價太大了,所以這道題我們根據數組的特征去構造一棵二叉平衡樹。
二叉平衡樹的左右高度之差小于等于1,那么我們每次按照這個策略構造即可完成一個二叉平衡樹:每次選取待構造的中間節點當成根節點,然后遞歸的將左右兩個區域按照同樣方法構造。
具體實現的代碼為:
/*** 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;} }將有序鏈表轉換為二叉平衡樹
給定一個單鏈表,其中的元素按升序排序,將其轉換為高度平衡的二叉搜索樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定的有序鏈表: [-10, -3, 0, 5, 9],一個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜索樹:0/ \-3 9/ /-10 5分析:
這道題的核心思路和有序數組的轉換成平衡二叉樹差不多,但是鏈表的弱點就是查詢效率,當然你可以先枚舉一遍鏈表然后轉換成數組轉換成二叉平衡樹的問題,和上一題的思路相同,但是這里的話就是用一個快慢指針進行查找。
當然,每次找到中間節點的時候同樣需要將鏈表分成兩部分,這樣我事先將慢指針設置一個前驅節點在操作的時候更容易拆分成兩個部分。
具體的代碼為:
/*** 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;} }原創不易,bigsai請你幫兩件事幫忙一下:
star支持一下, 您的肯定是我在平臺創作的源源動力。
微信搜索「bigsai」,關注我的公眾號,不僅免費送你電子書,我還會第一時間在公眾號分享知識技術。加我還可拉你進力扣打卡群一起打卡LeetCode。
記得關注、咱們下次再見!
總結
以上是生活随笔為你收集整理的经典面试题:将有序数组、有序链表转换成平衡二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经典面试题:给两个序列如何构造一棵二叉树
- 下一篇: 经典笔试题: 二叉树中和为某一值的路径(