1.二叉树结点值为数组,首先定义两颗树分别对应图示:
Tree T1;
Tree T2;
int arr1[] = {40, 25, 60, -1, 30, -1, 80, -1, -1, 27};
int arr2[] = {40, 50, 60, -1, 30, -1, -1, -1, -1, -1, 35};
int i;
for (i=0; i<10; i++)
T1.Node[i] = arr1[i];
T1.length = 10;
for (i=0; i<11; i++)
T2.Node[i] = arr2[i];
T2.length = 11;
分别对应图示:
2.二叉搜索树定义:
(1)若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值。
(2)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值。
(3)它的左、右子树也分别为二叉搜索树。
3.关于二叉搜索树的函数:要传递i为在数组中的位置,也为在树中的位置;树当前结点为i,左分支为2i+1,右分支为2i+2;如果右分支序列小于T的长度并且结点值不等于-1时开始判断:
如果右分支小于当前结点,左分支大于当前结点则不是二叉搜索树;在递归判断左子树右子树,有任一方不符合条件则不是二叉搜索树。
bool search(Tree T,int i){
if((2*i+2)<T.length&&T.Node[i]!=-1){
if(T.Node[2*i+1]>=T.Node[i]){
return false;
}
if(T.Node[2*i+2]<=T.Node[i]){
return false;
}
if(!search(T,2*i+1)){
return false;
}
if(!search(T,2*i+2)){
return false;
}
}
return true;
}
4.完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MaxSize 12
typedef struct{
int Node[MaxSize];
int length;
}Tree;
bool search(Tree T,int i){
if((2*i+2)<T.length&&T.Node[i]!=-1){
if(T.Node[2*i+1]>=T.Node[i]){
return false;
}
if(T.Node[2*i+2]<=T.Node[i]){
return false;
}
if(!search(T,2*i+1)){
return false;
}
if(!search(T,2*i+2)){
return false;
}
}
return true;
}
int main() {
Tree T1;
Tree T2;
int arr1[] = {40, 25, 60, -1, 30, -1, 80, -1, -1, 27};
int arr2[] = {40, 50, 60, -1, 30, -1, -1, -1, -1, -1, 35};
int i;
for (i=0; i<10; i++)
T1.Node[i] = arr1[i];
T1.length = 10;
for (i=0; i<11; i++)
T2.Node[i] = arr2[i];
T2.length = 11;
if(search(T1,0)){
printf("T1是二叉搜索树");
}
else{
printf("T1不是二叉搜索树");
}
printf("\n");
if(search(T2,0)){
printf("T2是二叉搜索树");
}
else{
printf("T2不是二叉搜索树");
}
return 0;
}
5.程序的结果为: