Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<istream>
- #include<fstream>
- #include <string>
- #include<iostream>
- #include <sstream>
- using namespace std;
- /*Горбунов Никита мас-301
- 45 Написать набор функций, позволяющих работать с бинарным деревом
- вещественных чисел:
- а. Ввести дерево из файла. Формат ввода: в каждой строке файла - одно
- число, перед которым могут стоять символы табуляции. Пусть в какой-то
- строке стоит число n в позиции k. Тогда потомки числа n стоят в
- последующих строках в позиции (k+1). Пример. Следующий файл:
- 5
- 6
- 7
- 8
- -10
- -5
- 9
- 11
- 13
- кодирует дерево
- 5
- / \
- / \
- 6 9
- / \ / \
- 7 8 11 13
- / \
- -10 -5
- б. Посчитать высоту и количество элементов в дереве
- в. Напечатать путь от корня дерева до заданного элемента
- г. Напечатать элементы дерева заданного уровня (уровень 0 -- корень
- дерева, уровень 1 -- потомки корня и т.п.)
- */
- struct TreeElem
- {
- double info; //info - Число, которое я буду записывать в дерево
- TreeElem *left, *right; //Адресные поля. Адрес левой части и Адрес правой части
- };
- void PrintTree(TreeElem *root) //Функция обхода
- {
- if (root) //Пока не встретится пустое звено
- {
- cout << root->info << " "; //Отображаем корень дерева
- PrintTree(root->left); //Рекурсивная функция для вывода левого поддерева
- PrintTree(root->right); //Рекурсивная функци для вывода правого поддерева
- }
- }
- void AddElem(TreeElem *&root, int i) //Функция добавления звена в дерево
- {
- if (!root)
- {
- root = new TreeElem; //Выделяем память под звено дерева
- root->info = i; //Записываем данные в звено
- root->left = root->right = 0; //Подзвенья инициализируем пустотой во избежание ошибок
- return;
- }
- if (i<root->info) AddElem(root->left, i);
- if (i>root->info) AddElem(root->right, i);
- else return;
- }
- void DelTree(TreeElem*& root){
- if (!root)
- return;
- DelTree(root->left);
- DelTree(root->right);
- delete root;
- root=0;
- }
- TreeElem* Make(istream& in, int curspaces, string& str){
- TreeElem* root = 0;
- root = new TreeElem;
- std::stringstream ss;
- ss << str;
- ss >> root->info;
- root->left = 0;
- root->right = 0;
- getline(in, str);
- int count = 0;
- char a = str[0];
- for (int i = 0; i<str.length() && str[i] == ' '; ++i){
- count++;
- }
- if (count > curspaces){
- root->left = Make(in, count, str);
- int count2 = 0;
- for (int i = 0; i<str.length() && str[i] == ' '; ++i){
- count2++;
- }
- if (count2 > curspaces){
- root->right = Make(in, count, str);
- }
- return root;
- }
- else if (count == curspaces){
- return root;
- }
- else {//count < spaces
- return root;
- }
- }
- TreeElem* MakeTreeFromFile(string FileName){
- ifstream name(FileName.c_str());
- TreeElem* root = 0;
- string str = "";
- getline(name, str);
- int count = 0;
- for (int i = 0; i<str.length() && str[i] == ' '; ++i){
- count++;
- }
- root = Make(name, count, str);
- return root;
- }
- int NodeCount(TreeElem * root)
- {
- if (root->left == 0 && root->right == 0)
- return 1;
- int l, r;
- if (root->left != 0)
- l = NodeCount(root->left);
- else
- l = 0;
- if (root->right != 0)
- r = NodeCount(root->right);
- else
- r = 0;
- return l+r+1;
- }
- int HeightOfTree(TreeElem * root)
- {
- if(root == 0)
- return 0;
- int l, r;
- if (root->left != 0) {
- l = HeightOfTree(root->left);
- }else
- l = -1;
- if (root->right != 0) {
- r = HeightOfTree(root->right);
- }else
- r = -1;
- int max = l > r ? l : r;
- return max+1;
- }
- void PrintTreeLvl(TreeElem *root,int level){
- if(root==0) return;
- if (level == 0)
- {
- cout << root->info << " ";
- }
- PrintTreeLvl(root->left,level-1);
- PrintTreeLvl(root->right,level-1 );
- }
- bool Search(TreeElem* root, double& x){
- if (!root) return false;
- if (abs(root->info - x) < 0.00001) return true;
- bool a1,a2;
- if (root->left) a1=Search(root->left, x); else a1 = false;
- if (root->right) a2=Search(root->right, x); else a2 = false;
- if (a1 || a2) return true;
- else return false;
- }
- bool SearchWaySub(TreeElem* root, double& x){
- if (!root) return false;
- if (abs(root->info - x) < 0.00001) return true;
- bool a1,a2;
- if (root->left) a1=SearchWaySub(root->left, x); else a1 = false;
- if (root->right) a2=SearchWaySub(root->right, x); else a2 = false;
- if (a1 || a2){
- if (a1) cout << root->left->info << " ";
- else cout << root->right->info << " ";
- return true;
- }
- else return false;
- }
- void SearchWay(TreeElem* root, double& x){
- if (!root){
- cout << "Tree is empty.";
- return;
- }
- SearchWaySub(root,x);
- cout << root->info << endl;
- }
- int main(int argc, char** argv) {
- string FileName = "C:\\ccc\\1.txt";
- TreeElem *Tree = 0;
- Tree = MakeTreeFromFile(FileName);
- PrintTree(Tree); //Вызов функции обхода дерева;
- int count = NodeCount(Tree);
- cout<<"The number of nodes " << count<<endl;
- int hght = HeightOfTree(Tree);
- cout <<"Height of Tree " << hght<<endl;
- cout <<"Enter the lvl"<<endl;
- int level;
- cin>> level;
- PrintTreeLvl(Tree,level);
- cout<<"Enter node"<<endl;
- double x;
- cin>>x;
- // cout<< Search(Tree,x);
- // cout << endl;
- SearchWay(Tree, x);
- DelTree(Tree);
- system("PAUSE");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement