平衡二叉树DSW算法

#include<iostream>
#include<stdlib.h>
#include<math.h>

using namespace std;
class Node{
public:
	int el;
	Node *left,*right;
	Node(){
		left=0;right=0;
	}
	Node(int data){
		el = data;left=0;right=0;
	}
};
class Tree{
public:
	Node *root;
	Tree(){
		root=0;size=0;
	}
	Tree(int el){
		root=new Node(el);size=1;
	}
	void insert(int el){
		Node *ins = new Node(el),*tmp=root,*par;
		if(tmp==0){
			root = ins;
			size++;
			return;
		}
		while(tmp!=0){
			par = tmp;
			if(tmp->el>el)tmp = tmp->left;
			else tmp = tmp->right;
		}
		if(par->el>el)
			par->left = ins;
		else
			par->right = ins;
		size++;
	}

	//  转换成右链
	void creatBackbone(){
		Node *Gr=0,*par=root,*ch=0;
		while(par!=0){
			ch = par->left;
			if(ch!=0){
				rotateRight(Gr,par,ch);
				par=ch;
			}else{
				Gr=par;
				par=par->right;
			}
			// 旋转过程中,如果是绕根节点的右节点旋转时要将根节点置为原根节点的右节点
			if(Gr==0)root = ch;
		}
	}
	void rotateRight(Node *Gr,Node *par,Node *ch){

		if(Gr!=0)Gr->right=ch;
		par->left=ch->right;
		ch->right=par;
	}
	// 平衡二叉树
	void creatPerfectTree(){
		int n = size;
		int m = (1<<((int)(log10(n+1)/log10(2))))-1;
		int i;
		Node *Gr=0,*tmp;
		if(size<3)return;printf("%d\n",m);
		for(i=0,Gr=root;i<n-m;i++){
			if(i==0){
				// 此处Gr是旋转时被绕的节点的祖父节点,下边以Gr->right传引用方便旋转函数赋值操作
				Gr = Gr->right;
				rotateLeft(root);
			}else if(Gr&&Gr->right){
				// 提前保存下次绕点的祖父节点,旋转后它们之间关系被破坏
				tmp = Gr->right->right;
				rotateLeft(Gr->right);
				Gr = tmp;
			}
		}
		while(m>1){
			m = m/2;
			for(i=0,Gr=root;i<m;i++){
				if(i==0){
					Gr = Gr->right;
					rotateLeft(root);
				}else if(Gr&&Gr->right){
					tmp = Gr->right->right;
					rotateLeft(Gr->right);
					Gr = tmp;
				}
			}
		}
	}
	void rotateLeft(Node *&Gr){
		if(!Gr) return;
		Node *par = Gr->right;
		if(!par)return;
		Node *ch  = par->right;
		Gr->right=par->left;
		par->left=Gr;
		Gr = par;
	}
private:
	int size;
};
int main(){

	int a[] = {0,3,4,5,6,1,2,7,11,12,8,9,10,13,14};
	int i;
	Tree *tree = new Tree();
	for(i=0;i<15;i++){
		tree->insert(a[i]);
	}
	tree->creatBackbone();
	tree->creatPerfectTree();
	return 0;
}

  

时间: 2024-07-30 02:16:32

平衡二叉树DSW算法的相关文章

数据结构例程——平衡二叉树

本文是[数据结构基础系列(8):查找]中第8课时[平衡二叉树]的例程. 平衡二叉树相关算法 #include <stdio.h> #include <malloc.h> typedef int KeyType; //定义关键字类型 typedef char InfoType; typedef struct node //记录类型 { KeyType key; //关键字项 int bf; //平衡因子 InfoType data; //其他数据域 struct node *lchi

优先队列---Shaolin

Description Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shaolin temple every year, trying to be a monk there. The master of Shaolin evaluates a young man mainly by his talent on understanding the Buddism scripture, but

树的基础概念(二)

堆 堆:经过排序的完全二叉树,其中任一非叶子节点的值均不大于(或不小于)其左孩子和右孩子结点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根节点的键值是所有堆结点键值中最大者. 最小堆:根节点的键值是所有堆结点键值中最小者. 最大-最小堆:集结了他俩的优点.是最大层和最小层交替出现的二叉树,即最大层节点的儿子属于最小层,最小层节点的儿子属于最大层.以最大(小)层节点为根节点的子树保有最大(小)堆性质:根节点的键值为该子树结点键值中最大(小)项. ======================

T-SQL查询——深入理解索引,原理(B树)

在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能高.在OLAP中尤其明显,要完全理解索引的概念,需要了解大量原理性的知识,包括B树,堆,数据库页,区,填充因子,碎片,文件组等等一系列相关知识. 索引时对数据库中表中一列和多列的值进行排序的一种结构,使用索引可以快速访问数据表中特定的信息. 精简来说,索引时一种结构,在SQL Server中,索引和表(这里值得是加了聚集索引的表)的存储结构

数据结构与算法系列----平衡二叉树(AVL树)

一:背景 平衡二叉树(又称AVL树)是二叉查找树的一个进化体,由于二叉查找树不是严格的O(logN),所以引入一个具有平衡概念的二叉树,它的查找速度是O(logN).所以在学习平衡二叉树之前,读者需要了解二叉查找树的实现,具体链接:二叉查找树 那么平衡是什么意思?我们要求对于一棵二叉查找树 ,它的每一个节点的左右子树高度之差不超过1.(对于树的高度的约定:空节点高度是0:叶子节点高度是1.)例如下图: 如果我们的二叉查找树是不平衡该怎么办?进行旋转.经过分析发现,出现不平衡无外乎四种情况,下面我

算法学习笔记 平衡二叉树 AVL树

AVL树是最先发明的自平衡二叉查找树, 其增删查时间复杂度都是 O(logn), 是一种相当高效的数据结构.当面对需要频繁查找又经常增删这种情景时,AVL树就非常的适用.[ 博客地址:http://blog.csdn.net/thisinnocence ] AVL树定义 AVL树诞生于 1962 年,由 G.M. Adelson-Velsky 和 E.M. Landis 发明.AVL树首先是一种二叉查找树.二叉查找树是这么定义的,为空或具有以下性质: 若它的左子树不空,则左子树上所有的点的值均小

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

【LeetCode-面试算法经典-Java实现】【110-Balanced Binary Tree(平衡二叉树)】

[110-Balanced Binary Tree(平衡二叉树)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of eve

【LeetCode-面试算法经典-Java实现】【108-Convert Sorted Array to Binary Search Tree(排序数组转变为平衡二叉树)】

[108-Convert Sorted Array to Binary Search Tree(排序数组转变为平衡二叉树)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题目大意 给定一个升序排列的二叉树,将其转换为一棵高度平衡的二叉树. 解题思路 采用递归分治法. 代码