T41 二叉树的中序遍历 判定是否为二叉搜索树
顺序存储:
- 数组 长度为
- 左子树:下标
- 右子树:下标
// 判定是否为二叉搜索树
typedef struct {
int SqBiTNode[MAXSIZE];
int ElemNum;
} SqBiTree;
// T: 二叉树指针
// index: 当前节点下标
// prev: 上一个访问的节点值
bool inOrderCheck(SqBiTree* T, int index, int *prev) {
if (index >= T->ElemNum || T->SqBiTNode[index] == -1) return true; // 空节点
// 检查左子树
if (!inOrderCheck(T, 2 * index + 1, prev)) return false;
// 检查当前节点
if (T->SqBiTNode[index] <= *prev) return false; // 不满足 BST 条件
*prev = T->SqBiTNode[index];
// 检查右子树
if (!inOrderCheck(T, 2 * index + 2, prev)) return false;
return true;
}
bool isBST(SqBiTree T) {
if (T.ElemNum == 0) return true; // 空树是 BST
else if (T.SqBiTNode[0] == -1) return true; // 只有根节点是 BST
int prev = INT_MIN; // 记录上一个访问的节点值
return inOrderCheck(&T, 0, &prev);
}