你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

设计一个算法,判断一棵二叉排序树bt是否为平衡的。

2021/12/20 1:54:01

【问题描述】

设计一个算法,判断一棵二叉排序树bt是否为平衡的。

【输入形式】

两行,第一行是数据个数,第二行是输入数据

【输出形式】

true或者false,如果输入数据构成的二叉树是平衡的,输出true, 否则,输出false
【样例输入】

9

5 2 3 4 1 8 6 7 9
【样例输出】

true
【样例说明】
【评分标准】

#include<iostream>
#include<queue>
using namespace std;
const int length = 10;

template<class T>
class BTree {
private:
	struct Bin {
		T elem;
		Bin* lchild, * rchild;
	};
	Bin* root;

public:
	BTree();
	void Insert(T e);
	void CrBree();
	bool exists(T e) 
	{
		Bin* p = root;
		while (p != NULL) {
			if (p->elem == e)return true;
			else if (p->elem < e)p = p->rchild;
			else {
				p = p -> lchild;
			}
		}
		return false;
	}
	bool equal_factor(Bin* q)
	{	
		//判断每个节点平衡因子是否为1||-1||0
		int i, j;
		//判断左子树深度
		i = treedepth(q->lchild);
		//判断右子树深度
		j = treedepth(q->rchild);
		if (i - j == 0 || i - j == -1 || i - j == 1)return true;
		return false;
	}
	int treedepth(Bin* p)
	{
		if (p == NULL)
			return 0;
		int left = treedepth(p->lchild);
		int right = treedepth(p->rchild);
		return (left > right) ? (left + 1) : (right + 1);
	}
};

template<class T>
BTree<T>::BTree()
{
	root = NULL;
}

template<class T>
void BTree<T>::Insert(T e)
{
	if (!exists(e)) {
		Bin* q = new Bin;
		q->elem = e;
		q->lchild = q->rchild = NULL;
		Bin* p = root;
		while (p!=NULL) {
			if (e > p->elem && p->rchild != NULL) {
				p = p->rchild;
			}
			else if (e > p->elem && p->rchild == NULL) {
				p->rchild = q;
				break;
			}
			else if (e < p->elem && p->lchild != NULL) {
				p = p->lchild;
			}
			else if (e < p->elem && p->lchild == NULL) {
				p->lchild = q;
				break;
			}
		}
		if (p == NULL) {
			root = new Bin;
			root->elem = e;
			root->rchild = root->lchild = NULL;
		}
	}
}


template<class T>
void BTree<T>::CrBree()
{
	int m,n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> m;
		Insert(m);
	}
	//层次遍历
	bool judge = true;
	queue<Bin *>que;
	que.push(root);
	while (!que.empty()) {
		auto x = que.front();
		if (!equal_factor(x)) {
			judge = false;
			break;
		}
		que.pop();
		if (x->lchild != NULL) {
			que.push(x->lchild);
		}
		if (x->rchild != NULL) {
			que.push(x->rchild);
		}
	}
	if (judge)cout << "true";
	else {
		cout << "false";
	}

}


int main() {
	BTree<int>T;
	T.CrBree();
}