isbalanced.cpp
// $Id$
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Un arbol binario (AB) es balanceado si
1) Es el arbol vacio o,
2) Sus subarboles derecho e izquierdo son balanceados, y sus
alturas difieren a lo sumo en 1
Consigna: Escribir una funcion #bool is_balanced(btree<int> &T);#
que determina si el arbol esta balanceado.
[Tomado en el segundo parcial 2011-10-27].
keywords: arbol binario
FIN DE DESCRIPCION */
// -------------------------------------------------------------------
#include <cstdarg>
#include <cstdio>
#include <climits>
#include <iostream>
#include <map>
#include <set>
#include <algorithm>
#include "./util.h"
#include "./btree.h"
#include "./util_btree.h"
using namespace aed;
using namespace std;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
typedef btree<int>::iterator node_t;
bool is_balanced(btree<int> &T,node_t n,int &height) {
height = -1;
if (n==T.end()) return true;
node_t
ql = n.left(),
qr = n.right();
int hl,hr;
height = INT_MAX;
if (!is_balanced(T,ql,hl)) return false;
if (!is_balanced(T,qr,hr)) return false;
height = (hl>hr ? hl : hr)+1;
return abs(hl-hr)<=1;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool is_balanced(btree<int> &T) {
int height;
return is_balanced(T,T.begin(),height);
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Uses `decomp_int' for generating balanced trees
void decomp_int(btree<int> &T,node_t p) {
if (p==T.end()) return;
if (*p==1) return;
int mr=*p/2, ml=*p-mr;
T.insert(p.left(),ml);
decomp_int(T,p.left());
T.insert(p.right(),mr);
decomp_int(T,p.right());
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Wrapper for decomp_int
void decomp_int(btree<int> &T,int m) {
T.clear();
T.insert(T.begin(),m);
decomp_int(T,T.begin());
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
btree<int> T;
// These are most probably unbalanced
for (int j=1; j<10; j++) {
T.clear();
make_random_btree(T, 10, 1.);
T.lisp_print();
printf("\n");
printf("is balanced ? %d\n-----------\n",is_balanced(T));
}
// Balanced trees
for (int j=1; j<10; j++) {
T.clear();
decomp_int(T,j);
T.lisp_print();
printf("\n");
printf("is balanced ? %d\n-----------\n",is_balanced(T));
}
return 0;
}
Generated by GNU Enscript 1.6.6.