题目
思路:
建树的思路是不可行的, 对于普通二叉树一定需要中序遍历和另一个遍历来复原,对于二叉搜索树来说, 即使有一些规则限制, 通过一个前序遍历序列, 不能判断在只有一侧树时的情况. 引起的问题:
- 判断镜像还是原始二叉搜索树后, 需要保持其一致性, 不能该节点按照原始二叉树规则排列, 但其子树按照镜像二叉搜索树进行排列
- 当只有一侧子树存在时无法判断这是二叉搜索树还是其镜像.
- 由1,2两点, 当镜像搜索树的非叶节点层出现一侧存在树的情况, 会造成无法判断的情况.2. 当只有一侧子树存在时无法判断这是二叉搜索树还是其镜像. 3. 由1,2两点, 当镜像搜索树的非叶节点层出现一侧存在树的情况, 会造成无法判断的情况.3. 由1,2两点, 当镜像搜索树的非叶节点层出现一侧存在树的情况, 会造成无法判断的情况.2. 当只有一侧子树存在时无法判断这是二叉搜索树还是其镜像. 3. 由1,2两点, 当镜像搜索树的非叶节点层出现一侧存在树的情况, 会造成无法判断的情况.
8
\
6
/ \
7 5
这种情况, 在建树时, 非常难以解决, 除非写规则在遇到单侧二叉树时, 不判断其镜像关系, 这会让代码变得非常复杂
通过柳神的代码的点拨, 可以考虑直接由前序遍历序列按照原始二叉搜索树的规则得出其后序遍历, 如果结果小于N, 尝试用mirror规则去得出其后续遍历, 如果结果依然小于N, 则说明不是二者.
测试点:
// 题目给出的测试点
7
8 6 5 7 10 8 11
// 题目给出的测试点
7
8 10 11 8 6 7 5
// 题目给出的测试点
7
8 6 8 5 10 9 11
// 单侧子树, 原始二叉搜索树
4
8 6 5 7
// 单侧子树, 镜像二叉搜索树
4
8 6 7 5
// 上层是镜像,下层是原始, 对应最后一个测试点
7
8 10 8 11 6 7 5
expect: NO
// 增序
3
3 2 1
//降序
3
1 2 3
#include<iostream>
#include<vector>
using namespace std;
vector<int> pre, post;
bool is_mirror = false;