二叉排序树的定义:
一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的结点。
说白了就是无论是对整棵树还是其某棵子树,左子树的节点都比根节点小,右子树的节点都比根节点大
思路:
https://blog.csdn.net/feel_myself_is_lowB/article/details/108347389这里构造二叉排序树得到的遍历结果以及得到的二叉排序树树直接拿来看。
二叉排序树的中序遍历都是从小到大排序的
另外,根据其定义:对于任意一棵子树,其左子树的节点都比右子树的节点小,可以推出最左边这棵树的最左叶子结点值是最小的,也就是 1,看下图红色线划出部分。也可以判断 最右分支的叶子结点的值是最大的 ,看下图蓝色划出部分。所以只根据最大最小值可以有两种思路写代码。
再根据二叉排序树性质可以列出:左子树 < 根节点 < 右子树
利用递归,做起来就比较好做点
//判断是否是二叉查找树,结合着二叉树的遍历,理解起来就很容易了
bool isBSTByMin(BSTNode *root)
{
if (NULL == root)
{
return true;
}
static int min = INT_MIN; //定义最小的int
isBSTByMin(root->lChild); //靠最左边的左子树的 左边的叶子结点的data应该是最小的,但是应该大于INT_MIN
if (root->data <= min) //不存在相同节点的值
{
return false;
}
min = root->data;
isBSTByMin(root->rChild);
return true;
}
bool isBSTByMax(BSTNode *root)
{
if (NULL == root)
{
return true;
}
static int max = INT_MAX; //定义最小的int
isBSTByMax(root->rChild); //靠最左边的左子树的 左边的叶子结点的data应该是最小的,但是应该大于INT_MIN
if (root->data >= max) //不存在相同节点的值
{
return false;
}
max = root->data;
isBSTByMax(root->lChild);
return true;
}
如果调试跟踪一下,就会发现 每个节点的值都被作为基数比较过一次。
完整的代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct BinarySortTreeNode
{
int data; //数据
struct BinarySortTreeNode * lChild; //左子树
struct BinarySortTreeNode * rChild; //右子树
}BSTNode;
//插入节点
void insertNode(BSTNode *&node,int element)
{
if (NULL == node)
{
node = new BSTNode;
node->data = element;
node->lChild = NULL;
node->rChild = NULL;
}
if (element == node->data)
{
return;
}
if (element < node->data)
{
insertNode(node->lChild,element);
}
if (element > node->data)
{
insertNode(node->rChild,element);
}
}
//通过 节点数组 初始化二叉查找树
void initBST(BSTNode *&root,int ele[],int len)
{
if (NULL == ele || 0 == len)
{
return;
}
for (int i = 0; i < len; i++)
{
insertNode(root,ele[i]);
}
}
//释放二叉树
void freeBST(BSTNode *&root)
{
if (NULL == root)
{
return;
}
freeBST(root->lChild);
freeBST(root->rChild);
delete root;
root = NULL;
}
//判断是否是二叉查找树
bool isBSTByMin(BSTNode *root)
{
if (NULL == root)
{
return true;
}
static int min = INT_MIN; //定义最小的int
isBSTByMin(root->lChild); //靠最左边的左子树的 左边的叶子结点的data应该是最小的,但是应该大于INT_MIN
if (root->data <= min) //不存在相同节点的值
{
return false;
}
min = root->data;
isBSTByMin(root->rChild);
return true;
}
bool isBSTByMax(BSTNode *root)
{
if (NULL == root)
{
return true;
}
static int max = INT_MAX; //定义最小的int
isBSTByMax(root->rChild); //靠最左边的左子树的 左边的叶子结点的data应该是最小的,但是应该大于INT_MIN
if (root->data >= max) //不存在相同节点的值
{
return false;
}
max = root->data;
isBSTByMax(root->lChild);
return true;
}
int main()
{
int eleArr[] = { 5,3,8,7,2,9,1,10,6,4 };
int len = sizeof(eleArr) / sizeof(eleArr[0]);
BSTNode *root = NULL;
initBST(root,eleArr,len);
bool flag = isBSTByMin(root);
if (flag)
{
printf("这棵树 是 一颗二叉查找树\n");
}
else
{
printf("这棵树 不是 一颗二叉查找树\n");
}
flag = isBSTByMax(root);
if (flag)
{
printf("这棵树 是 一颗二叉查找树\n");
}
else
{
printf("这棵树 不是 一颗二叉查找树\n");
}
freeBST(root);
system("pause");
return 0;
}
或许我的想法是错的,如果发现了请帮忙指出一下 ,感谢。