一、判断是否为二叉排序树
1.设计思想
一棵二叉排序树应当满足中序遍历序列有序。根据这一特点,算法具体步骤如下:
①设置全局指针pre,保存当前遍历树结点的上一个结点。
②中序遍历该树,
i.若当前结点的左子树不满足二叉排序树,返回flase;
ii.若当前结点的值小于等于pre的值,返回flase;否则,把当前结点赋给pre指针
iii.若当前结点的左子树不满足二叉排序树,返回flase。
2.代码实现
//判断是否为二叉排序树
BiTNode* pre;//记录前一个访问结点
bool IsBiSortTree(BiTree T) {
if (!T) return true;//空指针返回ture;
if (!IsBiSortTree(T->lchild)) return false;//左子树不符合排序树,则整树不符合排序树
if (pre && pre->data >= T->data) return false;//若当前结点值小于前结点,则树不符合排序树
pre = T;
if (!IsBiSortTree(T->rchild)) return false;//右子树不符合排序树,则整树不符合排序树
return true;
}
/*typedef struct BiTNode {
elemtype data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode, * BiTree;*/
二、判断是否为平衡二叉树
1.设计思想
二叉平衡树的每一个子树都是一颗平衡树,利用后序遍历的递归判断每棵子树是否为平衡二叉树,具体步骤如下:
①若当前结点为空结点,返回0(0表示当前结点的高度)。
②判断左子树是否为平衡二叉树,若不是返回false;否则,返回左子树的高度。
③判断右子树是否为平衡二叉树,若不是返回false;否则,返回右子树的高度。
④若左右子树都是平衡二叉树,则判断以当前结点为根结点的树是否为平衡二叉树,若不是返回flase;否则,返回当前树高。
2.代码实现
//判断是否为平衡二叉树
int balance(BiTree T) {
if (!T) return 0;//空结点树高为0
int left = balance(T->lchild);
if (left == -1) return -1;//左子树不平衡,则整树不平衡
int right = balance(T->rchild);
if (right == -1) return -1;//右子树不平衡,则整树不平衡
if (abs(left - right) > 1) return -1;//判断当前子树是否平衡
return (left > right ? left : right) + 1;//返回当前子树高度
}
bool IsBalanceTree(BiTree T) {
return balance(T) != -1;//若balance(T) == -1 则表示树不平衡
}
/*typedef struct BiTNode {
elemtype data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode, * BiTree;*/