Код:
//tree.h
#ifndef _TREE
#define _TREE
#include <string.h>
#include <conio.h>
#include <stdio.h>
struct NODE{
char * EnglishWord;
char * RussianWord;
int Counter;
NODE * Right;
NODE * Left;
};
NODE* CreateNode(char *&EnglishWord,char *&RussianWord,int Counter)
{
NODE *NewNode=new NODE;
if (!NewNode) return NULL;
NewNode->EnglishWord=strdup(EnglishWord);
NewNode->RussianWord=strdup(RussianWord);
if ((!NewNode->EnglishWord)||(!NewNode->RussianWord)) {delete NewNode; return NULL;}
NewNode->Right=NULL;
NewNode->Left=NULL;
NewNode->Counter=Counter;
return NewNode;
}
int AddRightSon(NODE* &Node,char * EnglishWord,char *RussianWord,int Counter=0)
{
NODE *NewNode=CreateNode(EnglishWord,RussianWord,Counter);
Node->Right=NewNode;
return 1;
}
int AddLeftSon(NODE* &Node,char * EnglishWord,char *RussianWord,int Counter=0)
{
NODE *NewNode=CreateNode(EnglishWord,RussianWord,Counter);
Node->Left=NewNode;
return 1;
}
/*
NODE * FindNodeByCounter(NODE *root,int Counter)
{
NODE * Find=root;
if (!Find) return NULL;
while (Find->Counter!=Counter)
{
if (Counter>Find->Counter) Find=Find->Right;
if (Counter<Find->Counter) Find=Find->Left;
if (Find==NULL) return NULL;
}
return Find;
} */
NODE * FindNodeByCounter(NODE *root,int Counter,NODE *&LastNode)
{
NODE * Find=root;
if (!Find) return NULL;
LastNode=NULL;
while (Find->Counter!=Counter)
{
//{ printf("%p %s %s %i %p %p\n",Find,Find->EnglishWord,Find->RussianWord,Find->Counter,Find->Left,Find->Right);}
LastNode=Find;
if (Counter>Find->Counter) Find=Find->Right;
else {if (Counter<Find->Counter) Find=Find->Left;}
if (Find==NULL) return NULL;
}
return Find;
}
int PrintTree(NODE *root)
{
if (!root) return 0;
if (root->Left) PrintTree(root->Left);
printf("%s - %s (%i)\n",root->EnglishWord,root->RussianWord,root->Counter);
if (wherey()==24)
{
printf("Нажмите любую клавишу для продолжения...");
getch();
printf("\n");
}
if (root->Right) PrintTree(root->Right);
return 1;
}
int AddNode(NODE *&root,NODE*&Node)
{
if (!Node) return 0;
Node->Left=NULL;
Node->Right=NULL;
NODE *LastFind,*Find;
int Counter=Node->Counter;
if (!root) root=Node;
else
{
Find=FindNodeByCounter(root,Counter,LastFind);
if (!Find)
{
if (Counter<=LastFind->Counter) LastFind->Left=Node;
else LastFind->Right=Node;
//if (!LastFind->Right) LastFind->Right=Node;
//else LastFind->Left=Node;
}
else
{
if (LastFind)
{
Node->Left=Find;
if (LastFind->Left==Find) LastFind->Left=Node;
if (LastFind->Right==Find) LastFind->Right=Node;
}
else
{
Node->Left=root;
root=Node;
}
}
}
return 1;
}
NODE* AddNode(NODE *&root,char *EnglishWord,char *RussianWord,int Counter=0)
{
NODE * Node=CreateNode(EnglishWord,RussianWord,Counter);
if (!Node) return NULL;
if (!AddNode(root,Node)) return NULL;
else return Node;
}
void DeleteTree(NODE *&root)
{
if (root)
{
if (root->Left) DeleteTree(root->Left);
if (root->Right) DeleteTree(root->Right);
delete root;
}
}
NODE *FindMaxNode(NODE *root,NODE* &max,NODE*&last)
{
if (!root) return max;
if (root->Left) FindMaxNode(root->Left,max,last);
if (root->Counter>max->Counter) {last=max;max=root;}
if (root->Right) FindMaxNode(root->Right,max,last);
return max;
}
int FindParentNode(NODE*root,NODE *cur,NODE *&parent)
{
if (!root) return NULL;
if (parent->Right==cur) return 1;
if (parent->Left==cur) return 1;
if ((cur==root->Right)||(cur==root->Left)) {parent=root; return 1;}
FindParentNode(root->Left,cur,parent);
FindParentNode(root->Right,cur,parent);
return 0;
}
NODE * TransformTree(NODE *root)
{
NODE *lastroot=root;
NODE *cur=root,*last=NULL;
NODE *NewRoot=NULL;
if (!root) return NULL;
last=NULL;
while (1)
{
cur=root;
NODE *max;
max=root;
last=NULL;
max=FindMaxNode(root,max,last);
FindParentNode(root,max,last);
cur=max;
if ((max->Right)&&(max->Left))
{
NODE *ll=NULL;
while ((cur->Left)||(cur->Right))
{
ll=cur;
if (cur->Right) cur=cur->Right;
while (cur->Left) {ll=cur;cur=cur->Left;}
}
NODE *temp=new NODE;
if (!temp) {printf("Нехватка памяти");exit(1);}
temp->EnglishWord=cur->EnglishWord;
temp->RussianWord=cur->RussianWord;
temp->Counter=cur->Counter;
cur->EnglishWord=max->EnglishWord;
cur->RussianWord=max->RussianWord;
cur->Counter=max->Counter;
max->EnglishWord=temp->EnglishWord;
max->RussianWord=temp->RussianWord;
max->Counter=temp->Counter;
delete temp;
temp=cur;
cur=max;
max=temp;
if (ll->Right==max) ll->Right=NULL;
else {if (ll->Left==max) ll->Left=NULL;}
}
else
{
if (last)
{
if (last->Right==max) last->Right=max->Right;
else {if (last->Left==max) last->Left=max->Left;}
}
if (root==max)
{
if (root->Left) root=root->Left;
else {if (root->Right) root=root->Right;}
}
}
if ((root->Right==root)||(root->Left==root))
{
int h;
h=24;
}
max->Left=NULL;
max->Right=NULL;
AddNode(NewRoot,max);
if (max==root) break;
}
return NewRoot;
}
NODE *FindNodeByEnglishWord(NODE *root,char *EnglishWord)
{
if (!root) return NULL;
NODE *f=NULL;
if (root->Right) f=FindNodeByEnglishWord(root->Right,EnglishWord);
if (f) return f;
if (strcmpi(root->EnglishWord,EnglishWord)==0)
{
f=root;
f->Counter++;
return f;
}
if (root->Left) f=FindNodeByEnglishWord(root->Left,EnglishWord);
if (f) return f;
return NULL;
}
NODE *FindNodeByRussianWord(NODE *root,char *RussianWord)
{
if (!root) return NULL;
NODE *f=NULL;
if (root->Right) f=FindNodeByRussianWord(root->Right,RussianWord);
if (f) return f;
if (strcmpi(root->RussianWord,RussianWord)==0)
{
f=root;
f->Counter++;
return f;
}
if (root->Left) f=FindNodeByRussianWord(root->Left,RussianWord);
if (f) return f;
return NULL;