theme: channing-cyan
这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
1929 数组串联
思路分析
试试可不可以在原vector的位置添加元素,使其成为串联后的数组。怪不得有人30s就能做出来。。。
int n = nums.size();
for(int i = 0; i < n; i++){
nums.push_back(nums[i]);
}
注意下不能在for循环中使用nums.size()
1932 合并多个二叉搜索树
思路分析
为了简化问题的难度,题目中限制了trees中的二叉搜索树最多有三个节点,这样我们就可以将trees中所有节点都分为根结点和叶子节点两类。
问题分为两个部分:
- 是否可以合成为一个树
- 是否可以合成为一个二叉搜索树
那么我们如何判断是否可以合成为一棵树呢?问题1的难点在于我们对树的性质了解的不够深刻,不妨将问题反过来看,假设一定可以合成为一棵大树,那么一棵大树拆分为多棵树后,这些根结点其实是来自于trees中的叶子节点,只有大树的根结点一直是根结点,换句话说,判断是否合成一颗大树的方法就是找到这个根结点并让他有且只有一个。
这个只需要我们将叶子结点都存在map中,并遍历一次trees即可。
第二个问题则是判断是否合成为一棵二叉搜索树,二叉搜索树的定义题干已经给我们了,仅需要我们通过一次中序遍历,判定是否存在非法节点,即上一个遍历的节点是否大于当前节点(定义是左子树小于根结点小于右子树,但是中序遍历会使得从树这个数据结构转化成一个严格递增的数组,更容易判断)。
两个问题解决了,那么如何实现大树的构造呢,如果觉得无从下手不妨看看我们分析出来的“已知”。
我们会找到一个根结点treeNode,还是将问题反过来看,假设一定可以合成为一棵大树,那么我们仅仅需要找到根据叶节点的值找到对应插入的树,当然会存在找不到的情况下,但由于我们在之前已经通过计算保证了一定可以合成为一个树,所以找不到就代表这是一个大🌲的叶子节点,只需要保证所有的树都要被使用过没有遗漏就可以了。
最后再通过一次中序遍历保证树是一颗二叉搜索树。