数据结构-平衡树

来源:互联网 发布:华为怎么下载软件 编辑:程序博客网 时间: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;
}

0 0
原创粉丝点击