经典面试题:将有序数组、有序链表转换成平衡二叉树

微信搜一搜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请你帮两件事帮忙一下:

  1. star支持一下, 您的肯定是我在平台创作的源源动力。

  2. 微信搜索「bigsai」,关注我的公众号,不仅免费送你电子书,我还会第一时间在公众号分享知识技术。加我还可拉你进力扣打卡群一起打卡LeetCode。

记得关注、咱们下次再见!

image-20201114211553660

Big sai CSDN认证博客专家 数据结构与算法 爬虫 Java
原创公众号:「bigsai」,回复【bigsai】获取珍藏pdf书籍资源,回复【进群】即可加入leetcode打卡群。主要分享Java,数据结构与算法,期待你的关注!
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值