数据结构-平衡树
来源:互联网 发布:华为怎么下载软件 编辑:程序博客网 时间:2024/06/11 22:13
// 数据结构-平衡树.cpp : 定义控制台应用程序的入口点。
/*
举一个例子,如果爷爷分糖给明明(左儿子)和今今(右儿子),明明得了90块,
今今得了9块,爷爷还剩下1块,爷爷说明明,你把40块糖给今今,这个时候有个
问题,因为明明手里只有一块糖,剩下的89块糖分给了他的两个儿子大明和小明,
大明在左边(左儿子),小明在右边(右儿子),然后他问大明,你有多少糖,
如果你有49块糖的话,我就把小明送给爷爷当左儿子,让爷爷成为我右儿子,这
样我就是老大,我的左右儿子都会觉得平衡,如果你手里多于49块糖那么你就
送一些糖给小明,比如说你有60块,给小明11块,我再把小明送给爷爷当左儿子,
让爷爷成为我右儿子,这样我就是老大,我的左右儿子都会觉得平衡。如果你
手里小于49块糖比如你只有40块,那你就让小明给你9块,我再把小明送给爷爷当左儿子
,让爷爷成为我右儿子,这样我就是老大,我的左右儿子都会觉得
平衡。这个问题到这里简单截止了。实际中大明和小明也有他们的儿子,也会遇到
同样的问题,处理起来都是一样的,最后保证的是根节点左右两边的子节点
数量差不多,当然如果要更平衡,还需要使得子节点的左右子节点数量差不多
说的可能不完全正确,大概是这么个意思。
*/
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int item;
//基于关键字索引数组的符号表
static item*st;
static int M = 50;
typedef struct STnode* link;
struct STnode{
item ie; link l = nullptr, r = nullptr; int N=1;
void STinsert(item f){
STnode* temp_node = new STnode;
temp_node->ie = f;
STnode* temp_head = this;
while (temp_head){
temp_head->N += 1;
if (f > temp_head->ie){
if (temp_head->r == nullptr)
{
temp_head->r = temp_node;
break;
}
else
temp_head = temp_head->r;
}
else{//如果插入节点的值小于等于当前节点的值
if (temp_head->l== nullptr)
{
temp_head->l = temp_node;
break;
}
else
temp_head = temp_head->l;
}
}
}
};
void STinit(int maxN){
int i;
st = (item*)malloc((M + 1)*sizeof(item));
memset(st, 0xff, (M + 1)*sizeof(item));
}
int STcount(){
int i, N = 0;
for (i = 0; i < M;i++)
if (st[i] != -1)N++;
return N;
}
void STinsert(item ie){
}
//BST右旋转 左边节点比较多,送一些给右边
link rotR(link h){
link x = h->l;
h->l = x->r;
x->r = h;
return x;
}
//BST左旋转 右边节点比较多,送一些给左边
link rotL(link h){
link x = h->r;
h->r = x->l;
x->l = h;
return x;
}
//BST的划分操作
link partR(link h, int k){
if (h->N == 1)return h;
int t;
if (h->l == nullptr)
t = 0;
else
t = h->l->N;
if (t > k){
h->l = partR(h->l,k); h = rotR(h);
}
else if (t < k){
if (h->r != nullptr){
h->r = partR(h->r,k - t - 1); h = rotL(h);
}
}
return h;
}
//平衡一颗BST
link balanceR(link h){
if (h->N < 2)return h;
h = partR(h, h->N / 2);
if (h->l!=nullptr)
h->l = balanceR(h->l);
if (h->r != nullptr)
h->r = balanceR(h->r);
return h;
}
void printlist(link lk,int n){
if (lk == nullptr)return;
if (lk->r != nullptr)printlist(lk->r, n + 1);
for (int i = 1; i < n; i++)cout << " ";
cout << lk->ie << endl;
if (lk->l != nullptr)printlist(lk->l, n + 1);
}
int _tmain(int argc, _TCHAR* argv[])
{
STnode node1;
node1.ie = 3;
STnode node2;
node2.ie = 1;
STnode node3;
node3.ie = 6;
STnode node4;
node4.ie = 11;
STnode node5;
node5.ie = 9;
STnode node6;
node6.ie = 19;
STnode node7;
node7.ie = 16;
node1.l = &node2;
node1.r = &node3;
node3.l = &node4;
node3.r = &node5;
node5.l = &node6;
node5.r = &node7;
node5.N = 3;
node3.N = 5;
node1.N = 7;
printlist(&node1, 1);
link jj=balanceR(&node1);
printlist(jj, 1);
return 0;
}
/*
举一个例子,如果爷爷分糖给明明(左儿子)和今今(右儿子),明明得了90块,
今今得了9块,爷爷还剩下1块,爷爷说明明,你把40块糖给今今,这个时候有个
问题,因为明明手里只有一块糖,剩下的89块糖分给了他的两个儿子大明和小明,
大明在左边(左儿子),小明在右边(右儿子),然后他问大明,你有多少糖,
如果你有49块糖的话,我就把小明送给爷爷当左儿子,让爷爷成为我右儿子,这
样我就是老大,我的左右儿子都会觉得平衡,如果你手里多于49块糖那么你就
送一些糖给小明,比如说你有60块,给小明11块,我再把小明送给爷爷当左儿子,
让爷爷成为我右儿子,这样我就是老大,我的左右儿子都会觉得平衡。如果你
手里小于49块糖比如你只有40块,那你就让小明给你9块,我再把小明送给爷爷当左儿子
,让爷爷成为我右儿子,这样我就是老大,我的左右儿子都会觉得
平衡。这个问题到这里简单截止了。实际中大明和小明也有他们的儿子,也会遇到
同样的问题,处理起来都是一样的,最后保证的是根节点左右两边的子节点
数量差不多,当然如果要更平衡,还需要使得子节点的左右子节点数量差不多
说的可能不完全正确,大概是这么个意思。
*/
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int item;
//基于关键字索引数组的符号表
static item*st;
static int M = 50;
typedef struct STnode* link;
struct STnode{
item ie; link l = nullptr, r = nullptr; int N=1;
void STinsert(item f){
STnode* temp_node = new STnode;
temp_node->ie = f;
STnode* temp_head = this;
while (temp_head){
temp_head->N += 1;
if (f > temp_head->ie){
if (temp_head->r == nullptr)
{
temp_head->r = temp_node;
break;
}
else
temp_head = temp_head->r;
}
else{//如果插入节点的值小于等于当前节点的值
if (temp_head->l== nullptr)
{
temp_head->l = temp_node;
break;
}
else
temp_head = temp_head->l;
}
}
}
};
void STinit(int maxN){
int i;
st = (item*)malloc((M + 1)*sizeof(item));
memset(st, 0xff, (M + 1)*sizeof(item));
}
int STcount(){
int i, N = 0;
for (i = 0; i < M;i++)
if (st[i] != -1)N++;
return N;
}
void STinsert(item ie){
}
//BST右旋转 左边节点比较多,送一些给右边
link rotR(link h){
link x = h->l;
h->l = x->r;
x->r = h;
return x;
}
//BST左旋转 右边节点比较多,送一些给左边
link rotL(link h){
link x = h->r;
h->r = x->l;
x->l = h;
return x;
}
//BST的划分操作
link partR(link h, int k){
if (h->N == 1)return h;
int t;
if (h->l == nullptr)
t = 0;
else
t = h->l->N;
if (t > k){
h->l = partR(h->l,k); h = rotR(h);
}
else if (t < k){
if (h->r != nullptr){
h->r = partR(h->r,k - t - 1); h = rotL(h);
}
}
return h;
}
//平衡一颗BST
link balanceR(link h){
if (h->N < 2)return h;
h = partR(h, h->N / 2);
if (h->l!=nullptr)
h->l = balanceR(h->l);
if (h->r != nullptr)
h->r = balanceR(h->r);
return h;
}
void printlist(link lk,int n){
if (lk == nullptr)return;
if (lk->r != nullptr)printlist(lk->r, n + 1);
for (int i = 1; i < n; i++)cout << " ";
cout << lk->ie << endl;
if (lk->l != nullptr)printlist(lk->l, n + 1);
}
int _tmain(int argc, _TCHAR* argv[])
{
STnode node1;
node1.ie = 3;
STnode node2;
node2.ie = 1;
STnode node3;
node3.ie = 6;
STnode node4;
node4.ie = 11;
STnode node5;
node5.ie = 9;
STnode node6;
node6.ie = 19;
STnode node7;
node7.ie = 16;
node1.l = &node2;
node1.r = &node3;
node3.l = &node4;
node3.r = &node5;
node5.l = &node6;
node5.r = &node7;
node5.N = 3;
node3.N = 5;
node1.N = 7;
printlist(&node1, 1);
link jj=balanceR(&node1);
printlist(jj, 1);
return 0;
}
0 0
- 数据结构 - 平衡二叉树
- 数据结构: 平衡二叉树
- 数据结构 平衡二叉树
- 【数据结构】平衡二叉树
- 数据结构&&平衡二叉树
- 数据结构--平衡二叉树
- 数据结构--平衡二叉树
- 数据结构-平衡树
- 数据结构 平衡树treap
- 数据结构---平衡树
- 数据结构---平衡二叉树
- 数据结构--平衡二叉树
- 数据结构 平衡二叉树
- 数据结构-平衡二叉树
- 数据结构之平衡二叉树
- 数据结构 - 平衡二叉树 AVL
- 数据结构之 平衡二叉树
- 【数据结构】平衡二叉树_AVLTree
- Shell中uniq与sort -u两种去重的对比
- POJ 3617 Best Cow Line 贪心
- tornado.concurrent-Future
- 23种设计模式学习
- git忽略已经被提交的文件
- 数据结构-平衡树
- android引入类库出现错误原因
- 百度地图android studio导入开发插件
- Android开发中error: Error retrieving parent for item: No resource found that matches the given name解决方法
- linux I2C读写应用程序
- (JXL)JAVA读取Excel数据(包含多个Sheet)
- cocos2d-lua,tableView中设置了按钮的不可吞噬性,但是还是吞噬了,点住按钮不能拖到tableView
- Redis HA方案总结
- 给sqlite提速