验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
思路:使用中序遍历,并使用一个新的node指向上一个节点
private boolean isTwo = true;
private TreeNode pre;
public boolean isValidBST(TreeNode root) {
isTwo = true;
dfs(root);
return isTwo;
}
public void dfs(TreeNode root){
if(!isTwo || root==null){
return;
}
dfs(root.left);
if(pre!=null){
if(pre.val>= root.val){
isTwo = false;
return;
}
}
pre = root;
dfs(root.right);
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
摆动排序 II
给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。
你可以假设所有输入数组都可以得到满足题目要求的结果。
示例 1:
输入:nums = [1,5,1,1,6,4]
输出:[1,6,1,5,1,4]
解释:[1,4,1,5,1,6] 同样是符合题目要求的结果,可以被判题程序接受。
示例 2:
输入:nums = [1,3,2,2,3,1]
输出:[2,3,1,3,1,2]
提示:
1 <= nums.length <= 5 * 104
0 <= nums[i] <= 5000
题目数据保证,对于给定的输入 nums ,总能产生满足题目要求的结果
思路:将数组进行排序,并且将数组分成两份,前面的一份比后面一份多一个元素。并且把两份数组都进行翻转,按照从大到小。这样就可以避免刚好分隔的两个数组中,同时存在一个元素的问题
代码:
public void wiggleSort(int[] nums) {
Arrays.sort(nums);
// 分隔前后半段 前半段+1=后半段
int len = nums.length % 2 == 0 ? nums.length / 2 : nums.length / 2 + 1;
int lastLen = nums.length % 2 == 0 ? nums.length-len : nums.length-len+1;
int[] first = new int[len];
int[] last = new int[nums.length - len];
for (int i = len - 1,j=0; i >= 0; i--,j++) {
first[i] = nums[j];
}
for (int i = nums.length - 1, j = 0; i >= lastLen; i--, j++) {
last[j] = nums[i];
}
//一小一大
for (int i = 0, j = 0; i < nums.length; i++, j++) {
nums[i] = first[j];
i++;
if (j < last.length)
nums[i] = last[j];
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/wiggle-sort-ii