04-树5 Root of AVL Tree (25 分)

自己好笨哎…看了一下午的相关视频才总算把调整平衡二叉树的代码写出来…总结一下:
1.每次写代码,遇到可以复制的镜像代码,就爱丢三落四;
2.LR和RL这种需要调整两个步骤的旋转,先从靠叶子结点的两个下手;LL和RR分别为顺时针旋转和逆时针旋转,可以简单认为是“×”中两条斜杠位置的交换。
3.如果树为空,则高度为-1;叶子结点的高度为0;其他结点的高度为该结点到叶子结点的的最长路径长度。
4.每次插入新的结点,在调整为平衡树之后,同时更新结点的高度。

代码如下:

#include <iostream>
using namespace std;

typedef struct TreeNode *Tree;
struct TreeNode {
	Tree Left;
	Tree Right;
	int data;
	int height;
};

Tree NewNode(int t) {
	Tree T;
	T = new struct TreeNode;
	T->Left = T->Right = NULL;
	T->data = t;
	T->height = 0;//二叉树中结点的高度即该结点到叶子结点的路径长度
	return T;
}
int Max(int a, int b) {
	return a > b ? a : b;
}
int GetNodeHeight(Tree T) {//判断一个结点的高度:到叶子节点的最短路径
	if (!T)return -1;
	else {
		return T->height;
	}
}

Tree SingleLeftRotation(Tree A) {//左单旋 向右转
	Tree B = A->Left;
	A->Left = B->Right;//防止忽略B的右子树
	B->Right = A;
	//调整结束
	A->height = Max(GetNodeHeight(A->Left), GetNodeHeight(A->Right))+1;
	B->height = Max(GetNodeHeight(A), GetNodeHeight(B->Left)) + 1;
	return B;
}
Tree SingleRightRotation(Tree A) {//
	Tree B = A->Right;
	A->Right = B->Left;
	B->Left = A;
	A->height = Max(GetNodeHeight(A->Left), GetNodeHeight(A->Right)) + 1;
	B->height = Max(A->height, GetNodeHeight(B->Right)) + 1;
	return B;
}
Tree DoubleLeftRightRotation(Tree A) {
	//B和C做右单旋,返回C
	A->Left = SingleRightRotation(A->Left);
	//A和C做左单旋
	return SingleLeftRotation(A);
}
Tree DoubleRightLeftRotation(Tree A) {
	//B和C做zuo单旋,返回C
	A->Right = SingleLeftRotation(A->Right);
	//A和C做you单旋
	return SingleRightRotation(A);
}

Tree insert(Tree T, int t) {
	if (!T) {
		T = NewNode(t);//建立一棵树的头结点 
	}
	else {
		if (t > T->data) {//待插入的数据大于当前结点数据,则应该插在其右子树上面
			T->Right = insert(T->Right, t);
			if (GetNodeHeight(T->Right) - GetNodeHeight(T->Left) == 2) {
				if (t > T->Right->data) {
					T = SingleRightRotation(T);
				}
				else T = DoubleRightLeftRotation(T);
			}
		}
		else {
			T->Left = insert(T->Left, t);
			if (GetNodeHeight(T->Left) - GetNodeHeight(T->Right) == 2) {
				if (t < T->Left->data) {
					T = SingleLeftRotation(T);
				}
				else T = DoubleLeftRightRotation(T);
			}
		}
	}
	T->height = Max(GetNodeHeight(T->Left), GetNodeHeight(T->Right)) + 1;
	return T;
}
int main() {
	int N,t;
	cin >> N>>t;
	Tree T = NewNode(t);
	for (int i = 1; i < N; i++)
	{		
		cin >> t;
		T = insert(T, t);
	}
	if (T)cout << T->data << endl;//T里面有内容认为是真,否则为假
	system("pause");
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值