设计算法,判定给定的二叉树是否是二叉排序树,设此二叉树以二叉链表作为存储结构(c++)
时间: 2023-11-18 20:09:53 浏览: 102
可以使用递归方式来判断给定的二叉树是否是二叉排序树。对于二叉排序树来说,左子树的所有节点都小于根节点,右子树的所有节点都大于根节点。
具体实现如下:
```c++
// 定义二叉树节点结构体
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 判断二叉树是否是二叉排序树
bool isBST(TreeNode* root) {
if (!root) {
return true;
}
if (root->left && root->left->val > root->val) {
return false;
}
if (root->right && root->right->val < root->val) {
return false;
}
return isBST(root->left) && isBST(root->right);
}
```
该算法的时间复杂度为O(n),其中n为二叉树中节点的个数。
相关问题
设计算法,判定给定的二叉树是否是二叉排序树。设此二叉树以二叉链表作为存储结构。
可以通过中序遍历二叉树,判断遍历结果是否为升序序列来判断给定的二叉树是否是二叉排序树。具体步骤如下:
1. 对二叉树进行中序遍历,得到一个序列。
2. 判断序列是否为升序序列,如果是,则该二叉树是二叉排序树;否则,不是。
3. 中序遍历可以使用递归或者栈来实现。
4. 如果二叉树为空,则认为是二叉排序树。
代码示例(使用递归实现中序遍历):
bool isBST(TreeNode* root) {
vector<int> nums;
inorder(root, nums);
for (int i = 1; i < nums.size(); i++) {
if (nums[i] <= nums[i - 1]) {
return false;
}
}
return true;
}
void inorder(TreeNode* root, vector<int>& nums) {
if (root == nullptr) {
return;
}
inorder(root->left, nums);
nums.push_back(root->val);
inorder(root->right, nums);
}
c++判定给定二叉树是否为二叉排序树
判断给定二叉树是否为二叉排序树的方法如下:
1. 对于每个节点,其左子树所有节点的值都小于该节点的值,右子树所有节点的值都大于该节点的值。
2. 对于整棵树,每个节点都满足上述条件。
可以采用中序遍历的方法依次比较每个节点的值,如果中序遍历的结果是单调递增的,则该树为二叉排序树。以下是基于此方法的 C++ 代码实现:
```c++
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
// 二叉树结点定义
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 中序遍历二叉树
void inorderTraversal(TreeNode* root, vector<int>& v) {
stack<TreeNode*> s;
TreeNode* p = root;
while (p != NULL || !s.empty()) {
while (p != NULL) {
s.push(p);
p = p->left;
}
if (!s.empty()) {
p = s.top();
s.pop();
v.push_back(p->val);
p = p->right;
}
}
}
// 判断二叉树是否为二叉排序树
bool isBST(TreeNode* root) {
if (root == NULL) return true;
vector<int> v;
inorderTraversal(root, v);
for (int i = 1; i < v.size(); i++) {
if (v[i] <= v[i-1]) return false;
}
return true;
}
// 测试
int main() {
TreeNode* root = new TreeNode(5);
root->left = new TreeNode(3);
root->right = new TreeNode(6);
root->left->left = new TreeNode(2);
root->left->right = new TreeNode(4);
root->right->right = new TreeNode(7);
if (isBST(root)) {
cout << "该二叉树是二叉排序树" << endl;
} else {
cout << "该二叉树不是二叉排序树" << endl;
}
return 0;
}
```