※浙大版《数据结构(第2版)》题目集 练习4.2 平衡二叉树的根 (25 分)

值得一做。
练习平衡二叉树的操作
二叉搜索树的查找效率取决于树的高度,因此保持树的高度最小,即可保证树的查找效率。
而保持二叉平衡树的结构,查找效率最高。
我改了一下程序,去掉了麻烦的height参数,直接调用一个GetHeight()获取高度
才开始出错还以为这个函数错了— —!
结果发现是判定右旋那里把-1写成了1

#include 
#include

using namespace std;

typedef struct AVLNode* Position;
typedef Position AVLtree;

struct AVLNode {
	int Data;
	AVLtree Left;
	AVLtree Right;
};

int GetHeight(AVLtree T) {
	if (T == NULL)
	return 0;
	return (GetHeight(T->Left) > GetHeight(T->Right) ? GetHeight(T->Left) : GetHeight(T->Right))+1;
}
//二叉树的调整
AVLtree SingleLeftRotation(AVLtree A) {
	AVLtree B = A->Left;
	A->Left = B->Right;
	B->Right = A;
	return B;
}

AVLtree SingleRightRotation(AVLtree A) {
	AVLtree B = A->Right;
	A->Right = B->Left;
	B->Left = A;
	return B;
}

AVLtree DoubleLeftRightRotation(AVLtree A) {
	A->Left = SingleRightRotation(A->Left);
	return SingleLeftRotation(A);
}

AVLtree DoubleRightLeftRotation(AVLtree A) {
	A->Right = SingleLeftRotation(A->Right);
	A = SingleRightRotation(A);
	return A;
}

AVLtree Creattree(int x) {
	AVLtree t=(AVLtree)malloc(sizeof(struct AVLNode));
	t->Data = x;
	t->Left = t->Right = NULL;
	return t;
}

AVLtree Insert(AVLtree T, int  x) {
	if (!T)
		T = Creattree(x);//建树也是建子节点
	else if (x < T->Data) {
		T->Left = Insert(T->Left, x);
		if (GetHeight(T->Left) - GetHeight(T->Right) == 2)
			if (x < T->Left->Data)
				T = SingleLeftRotation(T);
			else
				T = DoubleLeftRightRotation(T);
	}
	else if (x > T->Data) {
		T->Right = Insert(T->Right, x);
		if (GetHeight(T->Left) - GetHeight(T->Right) == -2)
			if (x > T->Right->Data)
				T = SingleRightRotation(T);     /* 右单旋 */
			else
				T = DoubleRightLeftRotation(T); /* 右-左双旋 */
		
	}
	return T;
}

int main() {
	int n, tmp;
	cin >> n;
	AVLtree ans=NULL;
	while (n--) {
		scanf_s("%d", &tmp);
		ans=Insert(ans, tmp);
	}
	cout << ans->Data;
}

你可能感兴趣的:(#,数据结构,PTA练习)