Форум программистов, компьютерный форум CyberForum.ru

Бинарные деревья - C++

Восстановить пароль Регистрация
 
maks_b
4 / 4 / 0
Регистрация: 11.10.2011
Сообщений: 15
03.03.2013, 21:23     Бинарные деревья #1
Здравствуйте, помогите найти ошибку(всё компилируется):
Найти и удалить (правым удалением) среднюю по значению вершину из вершин дерева, у которых количество потомков в левом поддереве не равно количеству потомков в правом поддереве. Выполнить прямой (левый) обход полученного дерева.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
#include <fstream>
using namespace std;
 
struct TreeNode{
    int key;
    int depth;
    TreeNode *Left,*Right,*Parent;
};
void show(ostream & out ,TreeNode *tmp)
{
    if(!tmp)return;
    out<<tmp->key<<endl;
    if(tmp->Left)
    show(out,tmp->Left);
    if(tmp->Right)
    show(out,tmp->Right);
}
void AddNode(TreeNode *&pTree, int Key,TreeNode *Parent)
{
    if (pTree)
    {
        if (Key < pTree->key)
        {pTree->depth--;
        AddNode(pTree->Left, Key,pTree);}
        else if (Key > pTree->key)
        {pTree->depth++;
        AddNode(pTree->Right, Key,pTree);}
    }
    else{
        pTree = new TreeNode();
        pTree->key = Key;
        pTree->depth=0;
        pTree->Parent=Parent;
    }
}
TreeNode*  findRightMini(TreeNode *pTree){
    if(pTree->Left)
            return findRightMini(pTree->Left);
    else{
        return pTree;
    }
}
void findForDelet(TreeNode *tree,int *mass,int  &i)
{
    if(tree->Left!=NULL)
    {findForDelet(tree->Left,mass,i); }
    if(tree->depth){
        mass[++i]=tree->key;cout<<mass[i]<<" ";
    }
    if(tree->Right)
        findForDelet(tree->Right,mass,i);
    
}
void* NoNULL(void *a,void *b){
    if(a==NULL)return b;
    return a;
}
TreeNode * searchNode(TreeNode * ptmp, double key){
    if(!ptmp)return NULL;
    if (ptmp->key==key) return ptmp;
    return (TreeNode*)NoNULL(searchNode(ptmp->Left,key),searchNode(ptmp->Right,key));
}
void delet(TreeNode *pTree){    
    if(pTree==NULL)return;
    int *mass= new int[200];
    int n=0; 
    findForDelet(pTree,mass,n);
    
    if(n%2==0)return;
    TreeNode *tree1, *tree2;
        tree1=searchNode(pTree,mass[n/2+1]);
    
        
    if(tree1->Right){
        tree2=findRightMini(tree1->Right);
        if(tree1->Right->Left!=NULL)
               tree2->Parent->Left=tree2->Right;
        else   tree2->Parent->Right=tree2->Right;
        tree1->key=tree2->key;
    }
    else if(tree1->Left){
        tree1->key=tree1->Left->key;
        tree1->Right=tree1->Left->Right;
        tree1->Left=tree1->Left->Left;
    }
    }
int main(){
    ifstream in("in.txt");
    int key;
    TreeNode *tree = NULL; 
    
    while(in>>key){
        AddNode(tree, key, NULL);
    }
    if(tree!=NULL){
        delet(tree);
        ofstream out("out.txt");
        show(out,tree);
    }cin>>key;
    return 0;
}
Добавлено через 1 минуту
Это правильно или я не так понял условие?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2013, 21:23     Бинарные деревья
Посмотрите здесь:

C++ бинарные деревья
Бинарные деревья C++
Бинарные деревья C++
Бинарные деревья C++
Бинарные деревья C++
C++ Бинарные деревья
бинарные деревья С++ C++
Бинарные деревья C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 00:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru