Идеально сбалансированное дерево-C++ [закрыт]

190
27 мая 2018, 14:10

Нужно определить высоту узла. Думаю, нужно при помощи функции обхода дерева подсчитать высоту, вот только с реализацией проблемы.

 #include <iostream>
 #include <fstream>
 #include <cmath>
 #include <queue>
 using namespace std;
 ifstream in ("input.txt");
 struct tree {
 int inf;
 tree *right;
 tree * left ;
 };
 tree *node(int x){
 tree *n = new tree;
 n->inf = x;
 n->left = n->right = NULL;
 return n;
 }

 void create(tree *&tr, int n){
 int x;
 if (n > 0){
 in >> x;
 tr = node(x);
 int nl = n/2;
 int nr = n - nl - 1;
 create ( tr->left, nl);
 create ( tr->right,nr);
 }
 }
 void preorder(tree *tr){
 if (tr) {
 cout << tr->inf << " ";
 preorder( tr->left);
 preorder( tr->right);
 }
 }
 void preor(tree *tr){
 if (tr) 
     {
 preor( tr->left);
 preor( tr->right);
 }
 }
 int height(tree *tr,int uz){
     int k=0;
 if (tr) 
     if( tr->inf==uz)
     {
         preor( tr);
         k++;

     }
     return k;
 }
 int lefth(tree *tr){
 int k = 0;
 tree *x = tr;
 while (x){
 k++;
 x = x->left;
 }
 return k - 1;
 }
 int righth(tree *tr){
 int k = 0;
 tree *x = tr;
 while (x){
 k++;
 x = x->right;
 }
 return k - 1;
 }

 void add(tree *&tr, int x){
 tree *n = node(x);
 tree *y = tr;
 if (lefth ( tr ) == righth(tr)){
 do{
 y = y->left;
 }
 while (y->left);
 if (!y->left) y->left = n;
 else y->right = n;
 }
 else{
 do{
 y = y->right;
 }
 while (y->right);
 if (!y->left) y->left = n;
 else y->right = n;
 }
 }
 void find(tree *tr, int x, tree *&res){
 if (tr){
 if (tr->inf == x){
 res = tr;
 }
 else {
 find ( tr->left, x, res);
 find ( tr->right, x, res);
 }
 }
 }

 void print(tree *tr, int k){
 if (! tr ) cout << "Empty tree\n";
 else{
 queue<tree*> cur, next;
 tree *r = tr;
 cur.push(r);
 int j = 0;
 while (cur.size()){
 if (j == 0) {
 for (int i = 0; i < (int)pow(2.0, k) - 1; i++)
 cout << ' ' ;
 }
 tree *buf = cur.front () ;
 cur.pop();
 j++;
 if (buf){
 cout << buf->inf;
 next.push(buf->left);
 next.push(buf->right);
 for (int i = 0; i < (int)pow(2.0, k + 1) - 1; i++)
 cout << ' ';
 }
 if (!buf){
 for (int i = 0; i < (int)pow(2.0, k + 1) - 1; i++)
 cout << ' ';
 cout << ' ';
 }
 if(cur.empty()){
 cout << endl;
 swap(cur, next);
 j = 0;
 k--;
 }
 }
 }
 }
 int main(){
     int h;
int uz; 
 tree *tr = NULL;
 int n, x;
 in >> n;
 create ( tr , n);
 int k = int (log((float)n)/log((float)2.0));
 print ( tr , k);
 preorder( tr );
    cout<<"x=";
    cin>>uz;
    h=height(tr, uz);
    cout<<h;
 cout << endl;
 system("pause");
 return 0;
 }
READ ALSO
Запись и чтение вектора объектов класса в файл

Запись и чтение вектора объектов класса в файл

Возникла проблемаЯ изучил абсолютно все, что смог найти

217
QML. Repeater. Как узнать ID каждого элемента Repeater?

QML. Repeater. Как узнать ID каждого элемента Repeater?

Определенное количество кнопок создается с помощью Repeater(ListModel)Как обратится к определенной кнопки и узнать ее параметры(X, Y)? main

184
Как посчитать количество файлов в папке С++

Как посчитать количество файлов в папке С++

Буквально в конце написания проекта столкнулся с такой проблемой, что не могу придумать как посчитать количество файлов в папке, чтобы создать...

200