//----.h
struct TreeNode;
typedef TreeNode*PtrToNode;
typedef PtrToNode Tree;
typedef PtrToNode SearchTree;
typedef PtrToNode Position;
typedef int Elementype;
#ifndef _BinFineTRee_
#define _BinFineTRee_
class Tree_
{
SearchTree Root;
public:
Tree_();
//~Tree_();
void ERROR(char*);
SearchTree MakeEmpty(SearchTree T);
Position Find(Elementype E, SearchTree T);
Position FindMin(SearchTree T);
Position FindMax(SearchTree T);
SearchTree Insert(Elementype E, SearchTree T);
SearchTree Delete(Elementype E, SearchTree T);
Elementype Retrieve(Position P);
void Traverse(SearchTree 树根Root,int 树深度);
void Visit(SearchTree 树根Root, int 树深度);
};
#endif // !_BinFineTRee_
struct TreeNode;
typedef TreeNode*PtrToNode;
typedef PtrToNode Tree;
typedef PtrToNode SearchTree;
typedef PtrToNode Position;
typedef int Elementype;
#ifndef _BinFineTRee_
#define _BinFineTRee_
class Tree_
{
SearchTree Root;
public:
Tree_();
//~Tree_();
void ERROR(char*);
SearchTree MakeEmpty(SearchTree T);
Position Find(Elementype E, SearchTree T);
Position FindMin(SearchTree T);
Position FindMax(SearchTree T);
SearchTree Insert(Elementype E, SearchTree T);
SearchTree Delete(Elementype E, SearchTree T);
Elementype Retrieve(Position P);
void Traverse(SearchTree 树根Root,int 树深度);
void Visit(SearchTree 树根Root, int 树深度);
};
#endif // !_BinFineTRee_
//----.cpp
#include"BitTraverseTree.h"
#include<iostream>
using namespace std;
struct TreeNode{
Elementype Elem;
Tree LC;
Tree RC;
};
void Tree_::ERROR(char*ch){
cout << ch << endl;
exit(1);
}
Position Tree_::Find(Elementype E, SearchTree T){
if (T == NULL)
return NULL;
if (E < T->Elem)
return Find(E, T->LC);
else if (E>T->Elem)
return Find(E, T->RC);
else return T;
}
SearchTree Tree_::MakeEmpty(SearchTree T){
if (T == NULL)
return NULL;
MakeEmpty(T->LC);
MakeEmpty(T->RC);
delete T, T = NULL;
return NULL;
}
SearchTree Tree_::Insert(Elementype E, SearchTree T)
{
if (T == NULL)
{
T = new TreeNode;
if (T == NULL)
ERROR("New TreeNode Error cause Out of space!!!");
else
{
T->Elem = E;
T->LC = T->RC = NULL;
}
}
else if (E < T->Elem)
T->LC=Insert(E, T->LC);
else if (E>T->Elem)
T->RC=Insert(E, T->RC);
/*else T->Elem==E, do nothing ,return */
return T;
}
SearchTree Tree_::Delete(Elementype E, SearchTree T)
{
if (T == NULL)
cout << "Not find the Elemente!\n";
else if (E < T->Elem)
T->LC = Delete(E, T->LC);
else if (E>T->Elem)
T->RC = Delete(E, T->RC);
else if (T->LC&&T->RC)
{//----E==T->Elem,待删除点(数据结构与应用C语言第二版Page77页图示);
Position TmpMinP = FindMin(T->RC);
T->Elem = TmpMinP->Elem;
T->RC = Delete(T->Elem, T->RC);
}
else
{//----俩个包含无孩子的情况;
Position TmpP = T;
if (T->LC == NULL)
T = T->RC;
else if (T->RC == NULL)
T = T->LC;
delete TmpP, TmpP = NULL;
}
return T;
}
Elementype Tree_::Retrieve(Position P){
if (P == NULL)
return NULL;
return P->Elem;
}
Position Tree_::FindMin(SearchTree T){
if (T == NULL)
return NULL;
else if (T->LC == NULL)
return T;
else
return FindMin(T->LC);
}
Position Tree_::FindMax(SearchTree T){
if (T != NULL)
while (T->RC != NULL)
T = T->RC;
return T;
}
Tree_::Tree_(){
Root = new TreeNode;
if (Root == NULL)
ERROR("New TreeNode Error!\n");
else
{
int Rval = 5;
int IVArray[10] = { 4,2,7,3,9,1,6, 5,0,8 };
cout << "顶点是" << Rval << ",输入的是:\n";
for (int i = 0; i != 10; i++)
cout<<IVArray[i]<<',';
cout << endl;
Root->Elem = Rval;
Root->LC = Root->RC = NULL;
for (int i = 0; i != 10; i++)
Insert(IVArray[i], Root);
}
//Delete(2, Root);
Delete(11, Root);
Delete(9, Root);
Traverse(Root, 0);
}
void Tree_::Traverse(SearchTree T,int Level){
if (T == NULL)
return;
else
{
Visit(T, Level);
Traverse(T->LC,Level+1);
Traverse(T->RC,Level+1);
}
}
void Tree_::Visit(SearchTree T, int Level){
cout << "第"<<Level<<"层是: "<<T->Elem << endl;
}
//-----main.cpp
#include"BitTraverseTree.h"
#include<iostream>
using namespace std;
struct TreeNode{
Elementype Elem;
Tree LC;
Tree RC;
};
void Tree_::ERROR(char*ch){
cout << ch << endl;
exit(1);
}
Position Tree_::Find(Elementype E, SearchTree T){
if (T == NULL)
return NULL;
if (E < T->Elem)
return Find(E, T->LC);
else if (E>T->Elem)
return Find(E, T->RC);
else return T;
}
SearchTree Tree_::MakeEmpty(SearchTree T){
if (T == NULL)
return NULL;
MakeEmpty(T->LC);
MakeEmpty(T->RC);
delete T, T = NULL;
return NULL;
}
SearchTree Tree_::Insert(Elementype E, SearchTree T)
{
if (T == NULL)
{
T = new TreeNode;
if (T == NULL)
ERROR("New TreeNode Error cause Out of space!!!");
else
{
T->Elem = E;
T->LC = T->RC = NULL;
}
}
else if (E < T->Elem)
T->LC=Insert(E, T->LC);
else if (E>T->Elem)
T->RC=Insert(E, T->RC);
/*else T->Elem==E, do nothing ,return */
return T;
}
SearchTree Tree_::Delete(Elementype E, SearchTree T)
{
if (T == NULL)
cout << "Not find the Elemente!\n";
else if (E < T->Elem)
T->LC = Delete(E, T->LC);
else if (E>T->Elem)
T->RC = Delete(E, T->RC);
else if (T->LC&&T->RC)
{//----E==T->Elem,待删除点(数据结构与应用C语言第二版Page77页图示);
Position TmpMinP = FindMin(T->RC);
T->Elem = TmpMinP->Elem;
T->RC = Delete(T->Elem, T->RC);
}
else
{//----俩个包含无孩子的情况;
Position TmpP = T;
if (T->LC == NULL)
T = T->RC;
else if (T->RC == NULL)
T = T->LC;
delete TmpP, TmpP = NULL;
}
return T;
}
Elementype Tree_::Retrieve(Position P){
if (P == NULL)
return NULL;
return P->Elem;
}
Position Tree_::FindMin(SearchTree T){
if (T == NULL)
return NULL;
else if (T->LC == NULL)
return T;
else
return FindMin(T->LC);
}
Position Tree_::FindMax(SearchTree T){
if (T != NULL)
while (T->RC != NULL)
T = T->RC;
return T;
}
Tree_::Tree_(){
Root = new TreeNode;
if (Root == NULL)
ERROR("New TreeNode Error!\n");
else
{
int Rval = 5;
int IVArray[10] = { 4,2,7,3,9,1,6, 5,0,8 };
cout << "顶点是" << Rval << ",输入的是:\n";
for (int i = 0; i != 10; i++)
cout<<IVArray[i]<<',';
cout << endl;
Root->Elem = Rval;
Root->LC = Root->RC = NULL;
for (int i = 0; i != 10; i++)
Insert(IVArray[i], Root);
}
//Delete(2, Root);
Delete(11, Root);
Delete(9, Root);
Traverse(Root, 0);
}
void Tree_::Traverse(SearchTree T,int Level){
if (T == NULL)
return;
else
{
Visit(T, Level);
Traverse(T->LC,Level+1);
Traverse(T->RC,Level+1);
}
}
void Tree_::Visit(SearchTree T, int Level){
cout << "第"<<Level<<"层是: "<<T->Elem << endl;
}
<strong><span style="font-size:24px;">#include"BitTraverseTree.h"</span>
#include<conio.h>
using namespace std;
int main(){
Tree_ T1;
return _getch();
}</span></strong>