判断是否为二叉排序树和平衡二叉树(C/C++)

一、判断是否为二叉排序树

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;*/
发布了3 篇原创文章 · 获赞 1 · 访问量 127

猜你喜欢

转载自blog.csdn.net/weixin_42780429/article/details/102668489
今日推荐