(3)二叉树

二叉树的插入,删除,查找,平衡等操作。

关于二叉树的平衡那里,代码是正确的可以运行,但我现在已经看不懂了。。不得不说代码写成这样,可读性实在是个问题。

基本照抄严蔚敏数据结构

#include <iostream>
#include <stdlib.h>
#define LH 1
#define EH 0
#define RH -1
using namespace std;
//结构体 
typedef struct BiTree{
	int data;
	int bf;
	struct BiTree *lchild,*rchild;
}BiTree;
//查找算法 
BiTree* SearchBST(BiTree *T,int key){
	if((T == NULL) || key == T->data){
		return T;
	}else if(key < T->data){
		return SearchBST(T->lchild,key);
	}else{
		return SearchBST(T->rchild,key);
	}
}
//查找二叉排序树,并返回是否查找成功 
bool SearchBST(BiTree *T,int key,BiTree *f,BiTree *&p){
	//cout <<"search="<<key<<endl; 
	if(!T){
		p=f;//p指向访问过的最后一个节点 //f指向双亲,初始为NULL 
		return false;
	}else if(key == T->data){
		p=T;
		return true;
	}else if(key < T->data){
		return SearchBST(T->lchild,key,T,p);
	}else{
		return SearchBST(T->rchild,key,T,p); 
	}
} 
//当不存在元素时,执行插入
bool InsertDST(BiTree *&T,int e){
	cout <<"插入"<<e<<endl; 
	BiTree *p = NULL;
	if(!SearchBST(T,e,NULL,p)){//有节点时都返回双亲。没有节点时,没有输入返回NULL,有输入返回T也是NULL,所以都一样 
		BiTree *s = new BiTree;
		s->data = e;
		s->lchild = NULL;
		s->rchild = NULL;
		if(!p){
			T = s;
		}else if(e < p->data){
			p->lchild = s;
		}else{
			p->rchild = s;
		}
		return true;
	}else{
		return false;
	}
} 
//删除操作 
bool Delete(BiTree *&p){
	cout <<"删除"<<p->data<<endl; 
	if(!p->rchild){
		BiTree *q = p ;
		p = p->lchild;
		free(q);
	}else if (!p->lchild){
		BiTree *q = p ;
		p = p->rchild;
		free(q);
	}else{
		BiTree *q = p;
		BiTree *s = p->lchild;
		while(s->rchild){
			q = s;
			s = s->rchild;
		}
		p->data = s->data;
		if(q != p ){
			q->rchild = s->lchild;
		}else{
			q->lchild = s->lchild; 
		}
		delete s;
	}
	return true;
}
//删除二叉树中的元素
bool DeleteBST(BiTree *&T,int key){
	if(!T){
		return false;
	}else{
		if (key == T->data){
			return Delete(T);
		}else if(key < (T->data)){
			return DeleteBST(T->lchild,key);
		}else{
			return DeleteBST(T->rchild,key);
		}
	}
}
//中序遍历二叉树的递归算法
void print(BiTree *T){
	if(T){
		cout <<"中序遍历"<<T->data<<endl;
		print(T->lchild);
		print(T->rchild); 
	}
} 
void R_Rotate(BiTree *&p){
	BiTree *lc = p->lchild;
	p->lchild = lc->rchild;
	lc->lchild = p;
	p = lc;//返回根 
}
void L_Rotate(BiTree *&p){
	BiTree *rc = p->rchild;
	p->rchild = rc->lchild;
	rc->lchild = p;
	p = rc; 
}
void LeftBalance(BiTree *&T){
	BiTree *lc = T->lchild;
	switch (lc->bf){
		case LH://左边高,单右旋处理 
			T->bf = EH;//平衡因子处理 
			lc->bf = EH;
			R_Rotate(T);
			break;
		case RH://左高的双向旋转处理 
			 BiTree *rd = lc->rchild;
			 switch(rd->bf){
			 	case LH:
			 		T->bf = RH;
			 		lc->bf = EH;
			 		break;
			 	case EH:
			 		T->bf = EH;
			 		lc->bf = EH;
			 		break;
			 	case RH:
			 		T->bf = EH;
			 		lc->bf = LH;
			 }
			 rd->bf = EH;
			 L_Rotate(T->lchild);
			 R_Rotate(T);
	}
}
void RightBalance(BiTree *&T){
	BiTree *lc = T->rchild;
	switch (lc->bf){
		case RH:
			T->bf = EH;
			lc->bf = EH;
			L_Rotate(T);
			break;
		case LH:
			BiTree *rd = lc->lchild;
			 switch(rd->bf){
			 	case LH:
			 		T->bf = EH;
			 		lc->bf = RH;
			 		break;
			 	case EH:
			 		T->bf = EH;
			 		lc->bf = EH;
			 		break;
			 	case RH:
			 		T->bf = LH;
			 		lc->bf = EH;
			 }
			 rd->bf = EH;
			 L_Rotate(T->lchild);
			 R_Rotate(T);
	} 
}
//成功插入返回1,否则0.tanller指示是否插入。 
int InsertAVL(BiTree *&T,int e,bool &taller){
	if(!T){
		T = new BiTree;
		T->data = e;
		T->lchild = NULL;
		T->rchild = NULL;
		T->bf = EH;
		taller = true;
	}else{
		if(e == T->data){
			taller = false;
			return 0;
		}
		if(e < T->data){
			if(!InsertAVL(T->lchild,e,taller)) return 0;//递归,失败返回0 
			if(taller){
				switch (T->bf){
					case LH:
						LeftBalance(T);
						taller = false;
						break;
					case EH:
						T->bf = LH;
						taller = true;
						break;
					case RH:
						T->bf = EH;
						taller = false;
						break;
				}
			}
		}else{
			if(!InsertAVL(T->rchild,e,taller)) return 0;
			if(taller){
				switch (T->bf){
					case LH:
						T->bf = EH;
						taller = false;
						break;
					case EH:
						T->bf = RH;
						taller = true;
						break;
					case RH:
						RightBalance(T);
						taller = false;
						break;
				}
			} 
		}
	}
	return 1;//成功返回1
}
int main(){
	int arr[]={45,12,53,3,37,100,24,61,90,78};
	BiTree *T = NULL;
	int length = sizeof(arr)/sizeof(arr[0]);
	cout <<"length="<<length<<endl; 
	for(int i = 0 ;i < length;i++){
		InsertDST(T,arr[i]);
	}
	print(T);
	DeleteBST(T,100);
	print(T);	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值