本题要求实现函数,判断给定二叉树是否二叉搜索树。
函数接口定义:
bool IsBST ( BinTree T );
其中BinTree
结构定义如下:
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
函数IsBST
须判断给定的T
是否二叉搜索树,即满足如下定义的二叉树:
定义:一个二叉搜索树是一棵二叉树,它可以为空。如果不为空,它将满足以下性质:
- 非空左子树的所有键值小于其根结点的键值。
- 非空右子树的所有键值大于其根结点的键值。
- 左、右子树都是二叉搜索树。
如果T
是二叉搜索树,则函数返回true,否则返回false。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef enum { false, true } bool;
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree BuildTree(); /* 由裁判实现,细节不表 */
bool IsBST ( BinTree T );
int main()
{
BinTree T;
T = BuildTree();
if ( IsBST(T) ) printf("Yes\n");
else printf("No\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:如下图
输出样例1:
Yes
输入样例2:如下图
输出样例2:
No
//中序遍历,判断结点是否比左子树中的最大值还大,如果是则满足,否则不满足。空树特殊情况
bool IsBST ( BinTree T )
{
//函数检查根节点是否为空或其左右子树是否都为空,如果是,则返回 true.
//因为空树自然满足任何关于树结构的约束。
if((!T)||(!T->Left)&&(!T->Right)) return true;
//定义左子树
BinTree p = T -> Left;
//如果左子树存在,函数进入一个循环,在左子树中找到最大值。
if(p)
{
//意思是只要 p 有右子树就继续循环。
//在循环内部,p 向右移动,直到到达没有右子树的节点。
//这个节点就是左子树中的最大值节点,就是结点左子树的最右边。
while(p -> Right)
p = p -> Right;
//函数检查当前节点 T 的数据值是否小于最大值节点 p 的数据值。
//如果是,则返回 false,因为这意味着当前节点不能比其左子树中的最大值还大,不满足BST的条件。
if(T -> Data < p -> Data)
return false;
}
//函数递归地检查右子树是否满足BST的条件。
//如果右子树存在,函数调用 IsBST(T -> Right) 来检查右子树。
if(T -> Right)
return IsBST(T -> Right);
//如果右子树不存在(即 T -> Right 为空),则返回 true,因为一个没有右子树的节点自然满足BST的条件。
else
return true;
}