1.判断给定的二叉树是否为二叉排序树,如果是返回1,不是返回0。
思想:
二叉树是左子树<根<右子树。中序遍历是递增有序,可以通过比较当前结点与前驱关系来进行判断。
代码:
//pre为全局变量,保存当前结点中序前驱的值,初始为负无穷
KeyType pre = -32767;
int isBST(BiTree T){
int isLBST,isRBST;
if(T==NULL){
return 1;//空树为二叉排序树
} else{
isLBST = isBST(T->lchild);//判断左子树是否为平衡二叉树
if(isLBST==0||pre>=T->data){//这种情况不是二叉排序树
return 0;
}
pre=T->data;//更新前驱结点
isRBST=isBST(T->rchild);//判断右子树是否为二叉排序树
return isRBST;//这课树是否为二叉排序树可以由右子树来判断
}
}
2.从大到小输出二叉排序树中所有值不小于k的值。
思想:利用二叉排序树中序递归递增有序的特性,从右子树开始处理右子树,然后处理自己,最后处理左子树。
代码:
void GetNodek(BiTree T,TElemType k){
if(T==NULL) retuen;
if(T->rchild!=NULL) GetNodek(T->rchild,k);
if(T->data>=k) printf("%d",T->data);
if(T-lchild!=NULL) GetNodek(T->lchild,k);
}
3.已知非空二叉树T的结点值均为正数,采用顺序存储方式保存,数据结构定义如下:
typedef struct { // MAX_SIZE为已定义常量
Elemtype SqBiTNode[MAX_SIZE]; // 保存二叉树结点值的数组
int ElemNum; // 实际占用的数组元素个数
}SqBiTree;
T中不存在的结点在数组SqBiTNode中用-1表示。例如,对于下图所示的两棵非空二叉树T1和T2:
请设计一个尽可能高效的算法,判定一棵采用这种方式存储的二叉树是否为二叉搜索树,若是,则返回true,否则,返回false,要求:
⑴ 给出算法的基本设计思想。
⑵ 根据设计思想,采用C或C++语言描述算法,关键之处给出注释。
思想:二叉搜索树的特点是中序遍历是有序的。除去第一个结点,比较当前结点与前驱之间的关系,如果所有结点都满足,则是二叉搜索树。当前结点的下标为i,则左孩子为2*1+1,右孩子为2*i+2。
代码:
//pre为全局变量,保存当前结点中序前驱的值,初始为负无穷
ElemType pre = -32767;
bool BST(SqBiTree T ,int i){
//空树是二叉搜索树
if(i>=T.ElemNum || T.SqBiTree[i]==-1){
return true;
}
bool LBST=BST(T,i*2+1);//判断左子树
if(LBST==NULL || pre>=T.SqBiTree[i]) {//左子树不是二叉搜索树
return false;
}
pre=T.SqBiTree[i];
bool RBST=BST(T,i*2+2);//判断右子树
return RBST;
}
bool isBST(SqBiTree T){
return BST(T,0);
}