今天对上一个阶段位运算剩下的部分题目进行了收尾,主要是后面几个面试题以及剑指Offer中的题目,和前面LeetCode中本来就存在的题都是一样的,所以在这里就不再进行展示了。随后复习了以下树的深度优先、广度优先遍历等基本操作。树这一部分对我来说是一个比较生疏的知识点,以前只知道有这么一个数据结构,但是没有具体用过,所以最好要在暑假结束之前,对树的各种操作有一个比较熟练的把握。今天只做了一题。
1.将有序数组转化为二叉搜索树
//将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 // // 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 // // 示例: // // 给定有序数组: [-10,-3,0,5,9], // //一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: // // 0 // / \ // -3 9 // / / // -10 5 // // Related Topics 树 深度优先搜索
树的相关题目,很多时候都需要运用到递归的思想,这道题也不例外,由于需要根据中序遍历的序列恢复二叉搜索树。中序遍历的规则如下:
即是整个树在地面从左至右的投影:HDIBEJAFKCG。
由于整个 序列是从小到大进行排序的,所以我们可以选择中间的数作为新的根节点,以该元素左边的升序序列构建左子树,以该元素右边的升序序列构建右子树,这样得到的树就是一棵二叉搜索树啦~
public TreeNode sortedArrayToBST(int[] nums) {
return dfs(nums, 0, nums.length-1);
}
private TreeNode dfs(int[] nums, int lo, int hi){
if(lo > hi){
return null;
}else{
int mid = (lo + hi) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = dfs(nums, lo, mid - 1);
root.right = dfs(nums, mid+1, hi);
return root;
}
}
第一次认识甜姨: