天梯赛--L2-004 这是二叉搜索树吗? (25 分)(递归)

L2-004 这是二叉搜索树吗? (25 分)

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

  • 其左子树中所有结点的键值小于该结点的键值;
  • 其右子树中所有结点的键值大于等于该结点的键值;
  • 其左右子树都是二叉搜索树。

所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

输入格式:

输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。

输出格式:

如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出 YES ,然后在下一行输出该树后序遍历的结果。数字间有 1 个空格,一行的首尾不得有多余空格。若答案是否,则输出 NO

输入样例 1:

7
8 6 5 7 10 8 11

输出样例 1:

YES
5 7 6 8 11 10 8

输入样例 2:

7
8 10 11 8 6 7 5

输出样例 2:

YES
11 8 10 7 5 6 8

输入样例 3:

7
8 6 8 5 10 9 11

输出样例 3:

NO
<
### 验证给定结构是否为二叉搜索树 为了验证一个给定的树是否为有效的二叉搜索树,在 C++ 中可以利用递归方法遍历整棵树并检查每个节点是否满足二叉搜索树的条件。具体来说,对于每一个节点 `node` ,其左子树中的所有键值都应小于该节点的关键字 `_key` 而右子树中的所有关键字则应该大于此节点的关键字。 下面是一个基于上述逻辑编写的函数用于判断一棵树是否为合法的二叉搜索树: ```cpp #include <limits> using namespace std; template<typename T> bool IsValidBSTHelper(typename BSTree<T>::Node* node, const T& minVal, const T& maxVal){ if (!node) return true; if (node->_key <= minVal || node->_key >= maxVal) return false; bool isLeftValid = IsValidBSTHelper(node->_left, minVal, node->_key); bool isRightValid = IsValidBSTHelper(node->_right, node->_key, maxVal); return isLeftValid && isRightValid; } template<typename T> bool IsBinarySearchTree(BSTree<T>* tree){ if(!tree || !tree->_root) return true; using LimitsT = numeric_limits<T>; return IsValidBSTHelper(tree->_root, LimitsT::lowest(), LimitsT::max()); } ``` 这段代码定义了一个辅助函数 `IsValidBSTHelper()` 来递归地检验每棵子树的有效性,并通过设置上下限的方式确保当前节点及其后代均符合二叉搜索树的要求[^1]。 关于与 STL 的关系,实际上在 C++ 标准库中并没有直接提供名为 “binary search tree”的容器类型;然而,内部实现上像 `std::map` 或者 `std::set` 这样的关联式容器通常是以某种形式的自平衡二叉搜索树为基础构建而成——比如红黑树或 AVL 树等变体。这些数据结构能够保证即使是在最坏的情况下也能维持 O(log n) 的时间复杂度来进行查找、插入以及删除操作,从而提供了高效的性能表现[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值