判断给定的二叉树是否是二叉排序树

判断给定的二叉树是否是二叉排序树

根据二叉排序树的定义,左子树结点值 < 根结点值 < 右子树结点值,所以对二叉排序树进行中序遍历(LNR),可以得到一个递增的有序序列。因此,对给定的二叉树进行中序遍历,若始终能保持前一个值小于后一个值,则说明该二叉树是一颗二叉排序树。

栈的基本操作以严蔚敏编写的教材为准。

如有谬误或者不足还请批评指正!

基于非递归中序遍历算法判断:

int pre = -32767; //pre为全局变量,保存当前结点中序前驱的值,初始值为-∞

int IsBST(BSTree T)
{
	InitStack(S); //初始化栈
	BSTree p = T; //p为遍历指针
	while(p || !StackEmpty(S)) //树不空或栈不空,则循环
	{
		if(p) //一路向左
		{
			push(S, p); //当前结点入栈
			p = p->lchild; //左孩子不空,一直向左走
		}
		else //出栈,并转向出栈结点的右子树
		{
			pop(S, p); //栈顶元素出栈
			if(p->data < pre) 
			{
				//如果当前结点的值小于前驱pre的值,则不是二叉排序树,返回0
				return 0;
			}
			pre = p->data; //保存当前结点的值
			p = p->rchild; //向右子树走,p赋值为当前结点的右孩子
		} //返回while循环继续进入if-else语句
	}
	return 1; //是二叉排序树,返回1
}

基于递归中序遍历算法判断:

int pre = -32767; //pre为全局变量,保存当前结点中序前驱的值,初始值为-∞

int int IsBST(BSTree T)
{
	int left, right; //保存左右子树的判断结果
	if (T == NULL) //空树也是二叉排序树,返回1
		return 1;
	else
	{
		left = IsBST(T->lchild); //判断左子树是否是二叉排序树
		if (left == 0 || pre >= T->data) //若左子树返回0或前驱大于等于当前结点
			return 0; //则不是二叉排序树,返回0
		pre = T->data; //保存当前结点的值
		right = IsBST(T->rchild); //判断右子树是否是二叉排序树
		//因为执行到这里时,left的值一定为1,如果left为0上面的则if判断为真已经返回0了
		//所以最后直接返回右子树的结果就可以判断给定的二叉树是否是二叉排序树了
		return right; 
	}
}

你可能感兴趣的:(判断给定的二叉树是否是二叉排序树)