这两天都有参加笔试,感触很深的就是觉着每天保持练习一些算法题对自己是很有益处的,首先编程题不至于没有思想,中等难度的题目思考一会也基本上可以搞定,更重要的是基础知识也得到了一定的巩固,要知道算法在不仅会体现在笔试里,在面试中也会是一些面试官考察应聘者编程能力的重要方式,所以希望大家也可以每天练习一定量的相关题目来培养及优化自己的解题思想,贵在坚持哦~
今天来跟大家分享一道比较有趣的题目,也是二叉树的相关问题,我们都知道通过中序遍历二叉搜索树可以得到一个有序集合,那么大家知道怎样将一个有序集合转换为二叉查找树么,下面我们来看一下题目吧:
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
第一种解法:
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;
}
上面的两种实现方式相信大家理解起来会比较简单,当然我们都是通过中序遍历也就是深度优先遍历的方式来构建二叉树,显然只要能够使用深度优先搜索遍历的树也必然可以通过广度优先搜索的方式进行遍历,然层序遍历又得依赖栈进行操作,呃呃,具体我也没试着实现,有兴趣(哈哈)的同学可以尝试一下熟悉一下层序遍历,但代码复杂度是可想而知的,因为在前面的博文中也有分别通过两种方式解决问题,结果就是代码复杂度似乎是倍数级的,所以这里我只是提一下这种方式也是可行的,不建议大家习惯性的使用,毕竟有简单的方法可以达到相同的目的,且代码的复杂性也决定着我们的出错率。
那么这道题的分析也就到此结束啦,通过这道题其实也想让大家知道但凡是关于二叉树的问题几乎无法避免的会用到遍历,而这样的思维就得通过大家在做题的过程中构造了。二叉树的相关问题是相当频繁的一个考察点,我呢也会在以后的博文中经常分享二叉树的相关问题,所以还是希望大家以后在遇到二叉树的问题可以游刃有余哈~