判断是否为二叉排序树和平衡二叉树(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
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值