对给定的二叉树,假设其中各结点的值均不相同,设计算法以判断该二叉树是否是二叉排序树。用C++语言写出算法。其中二叉树的结构为typedef struct lBNode { int data; struct lBNode *lChild, *rChild; }BiNode;
时间: 2024-03-16 10:47:43 浏览: 13
判断一个二叉树是否为二叉排序树,需要满足以下条件:
1. 左子树中所有结点的值均小于根节点的值;
2. 右子树中所有结点的值均大于根节点的值;
3. 左子树和右子树都必须是二叉排序树。
根据上述条件,可以设计如下的算法:
```c++
bool isBST(BiNode* root, int min, int max) {
if (root == NULL) {
return true;
}
if (root->data < min || root->data > max) {
return false;
}
return isBST(root->lChild, min, root->data - 1) &&
isBST(root->rChild, root->data + 1, max);
}
bool isBinarySearchTree(BiNode* root) {
return isBST(root, INT_MIN, INT_MAX);
}
```
上述算法中,isBST函数用于判断当前节点是否满足二叉排序树的条件,并递归判断左右子树是否也满足二叉排序树的条件。isBinarySearchTree函数则是用于判断整棵二叉树是否为二叉排序树。
其中,INT_MIN和INT_MAX分别为整型变量的最小值和最大值,用于限制根节点的值的范围。
相关问题
假设二叉树每个结点的元素均为一个单字符,根据给定的字符序列按照先序遍历的顺序递归创建该树的二叉链表,然后判断该二叉树是否为二叉排序树。
根据先序遍历的顺序递归创建二叉树的过程如下:
1. 如果当前字符为 '\0',则返回 NULL。
2. 创建一个新结点,值为当前字符。
3. 递归创建左子树,将左子树的根结点作为当前结点的左孩子。
4. 递归创建右子树,将右子树的根结点作为当前结点的右孩子。
5. 返回当前结点。
判断该二叉树是否为二叉排序树的方法如下:
1. 对于每个结点,其左子树中所有结点的值都小于当前结点的值,其右子树中所有结点的值都大于当前结点的值。
2. 对于每个结点,其左子树和右子树都是二叉排序树。
下面是实现该算法的 C++ 代码:
```cpp
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
struct TreeNode {
char val;
TreeNode *left, *right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* createTree(char* s, int& pos) {
if (s[pos] == '\0') return NULL;
TreeNode* root = new TreeNode(s[pos]);
root->left = createTree(s, ++pos);
root->right = createTree(s, ++pos);
return root;
}
bool isBST(TreeNode* root, char min_val, char max_val) {
if (root == NULL) return true;
if (root->val <= min_val || root->val >= max_val) return false;
return isBST(root->left, min_val, root->val) && isBST(root->right, root->val, max_val);
}
bool isValidBST(TreeNode* root) {
return isBST(root, -128, 127);
}
int main() {
char s[1000];
scanf("%s", s);
int pos = 0;
TreeNode* root = createTree(s, pos);
if (isValidBST(root)) {
printf("The binary tree is a binary search tree.\n");
} else {
printf("The binary tree is not a binary search tree.\n");
}
return 0;
}
```
其中,createTree() 函数用于递归创建二叉树,isBST() 函数用于判断是否为二叉排序树,isValidBST() 函数用于调用 isBST() 函数判断整个二叉树是否为二叉排序树。
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;
}
```