LeetCode Convert Sorted Array to Binary Search Tree(有序数组转换为二叉查找树)

       这两天都有参加笔试,感触很深的就是觉着每天保持练习一些算法题对自己是很有益处的,首先编程题不至于没有思想,中等难度的题目思考一会也基本上可以搞定,更重要的是基础知识也得到了一定的巩固,要知道算法在不仅会体现在笔试里,在面试中也会是一些面试官考察应聘者编程能力的重要方式,所以希望大家也可以每天练习一定量的相关题目来培养及优化自己的解题思想,贵在坚持哦~

       今天来跟大家分享一道比较有趣的题目,也是二叉树的相关问题,我们都知道通过中序遍历二叉搜索树可以得到一个有序集合,那么大家知道怎样将一个有序集合转换为二叉查找树么,下面我们来看一下题目吧:

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

Example:

Given the sorted array: [-10,-3,0,5,9],

One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:

      0
     / \
   -3   9
   /   /
 -10  5
       题目大意就是将一个有序数组转换为一个二叉查找树,该树的任意一个结点左右子树差不能超过1。首先我们知道中序遍历是根据左根右次序依次遍历,那么反向通过数组构建二叉查找树则也应该通过左根右次序依次构造添加结点了,然后我们再来看一下题目的另外一个要求,任一结点的左右子树高度差不能超过1,那么这有说明了什么呢,再看一下题目给定的是有序数组,对于有序数组,我们还能想到什么呢,然后看一下二叉树的结构,如果左右子树高度差不能超过1,看以来是不是近乎平衡。那么相信我们心中的答案就更加确定了,二分查找自然也就浮出了水面,其实想想我们会发现几乎所有的二叉查找树从根节点开始划分左右子树,依次类推构造有序集合的方式不就类似于二分查找么,有了思想,相信下面的代码就不难实现了~
第一种解法
    public TreeNode sortedArrayToBST(int[] nums) {
		if(nums==null)
			return null;
        TreeNode root = createBST(nums,0,nums.length-1);
		return root;
    }
    private TreeNode createBST(int[] nums,int left,int right) {
	if(left-right==1)
		return null;
	int rootIndex = (left+right)/2;
	TreeNode node = new TreeNode(nums[rootIndex]);
	node.left = createBST(nums,left,rootIndex-1);
	node.right = createBST(nums,rootIndex+1,right);
	return node;
    }
第二种解法:(思想完全相同,简单的改写)
    public TreeNode sortedArrayToBST(int[] nums) {
        return helper(nums, 0, nums.length-1);
    } 
    private TreeNode helper(int[] nums, int left, int right) {
        if (nums == null || left > right) {
            return null;
        }
        int mid = left + (right - left) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = helper(nums, left, mid-1);
        root.right = helper(nums, mid+1, right);
        return root;
    }

       上面的两种实现方式相信大家理解起来会比较简单,当然我们都是通过中序遍历也就是深度优先遍历的方式来构建二叉树,显然只要能够使用深度优先搜索遍历的树也必然可以通过广度优先搜索的方式进行遍历,然层序遍历又得依赖栈进行操作,呃呃,具体我也没试着实现,有兴趣(哈哈)的同学可以尝试一下熟悉一下层序遍历,但代码复杂度是可想而知的,因为在前面的博文中也有分别通过两种方式解决问题,结果就是代码复杂度似乎是倍数级的,所以这里我只是提一下这种方式也是可行的,不建议大家习惯性的使用,毕竟有简单的方法可以达到相同的目的,且代码的复杂性也决定着我们的出错率。

       那么这道题的分析也就到此结束啦,通过这道题其实也想让大家知道但凡是关于二叉树的问题几乎无法避免的会用到遍历,而这样的思维就得通过大家在做题的过程中构造了。二叉树的相关问题是相当频繁的一个考察点,我呢也会在以后的博文中经常分享二叉树的相关问题,所以还是希望大家以后在遇到二叉树的问题可以游刃有余哈~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值