此时此刻没有学到数据结构这块 所以 思想还是停留在C 的坑
#include <iostream>
using namespace std;
class data
{
public:
data(int i):x(i){}
virtual ~data(){ cout << "data.....\n"; }
virtual void pint() = 0;
int getvalue(){ return x; }
void setvalue(int i){ x = i; }
private:
int x;
};
class shu:public data
{
public:
shu(int x):data(x){}
void pint()
{
cout << this->getvalue() <<" ";
}
};
class node
{
public:
node(data *pdata):Nada(pdata),zuo(NULL),you(NULL){}
node():Nada(NULL),zuo(NULL),you(NULL){}
~node(){ delete Nada; Nada = NULL; cout << "node......\n"; }
data*getNatda(){ return Nada; }
node*getyou(){ return you; }
void setzuo(node*Lzuo){ zuo = Lzuo; }
void setyou(node*Lyou){ you = Lyou; }
void setNada(data*Lnada){ Nada = Lnada; }
node *getzuo()
{
return zuo;
}
private:
data*Nada;
node*zuo;
node*you;
};
class Stack
{
public:
Stack() :top(NULL), datas(NULL), Conut(NULL){}
~Stack(){
if (Conut)
delete Conut; }
Stack*getST(){ return top; }
void SetSt(Stack*p){ top = p; }
node*getNode(){ return datas; }
void SetNode(node*p){ datas = p; }
void addConut(){ *(Conut)+=1; }
void subConut(){ *(Conut)-=1; }
void SetConut(){
if (Conut==NULL)
Conut=new int(0); }
bool is_emty(){ return *Conut == 0; }
private:
Stack *top;
node *datas;
int *Conut;
};
class List
{
public:
List() :Ldata(NULL), Ltp(NULL),LConut(NULL){}
~List(){
if (LConut)
delete LConut; }
List*getLst(){ return Ltp; }
void SetLnode(node*p){ Ldata = p; }
node*Getnode(){ return Ldata; }
bool Lis_emty(){ return *LConut == 0; }
void SetLst(List*p){ Ltp =p ; }
void SetLconut()
{
if (LConut == NULL)
LConut = new int(0);
}
void addLConut(){ *(LConut)+=1; }
void subLConut(){ *(LConut)-=1; }
private:
List *Ltp;
node* Ldata;
int *LConut;
};
class S
{
public:
S() :head(NULL), Lbesk(NULL), besk(NULL), LSt(NULL),onew(NULL){}
~S()
{
if (head)
{
deleteall();
}
if (head)
cout << "还有数据\n";
if (Lbesk)
{
delete Lbesk;
LSt = Lbesk = NULL;
}
if (onew)
{
delete onew;
onew = NULL;
}
if (besk)
{
delete besk;
besk = NULL;
}
}
void inst(data *pdata)
{
if (head == NULL&&onew == NULL)
{
head = new node;
onew = new int(0);
head->setNada(pdata);
*(onew)+=1;
return;
}
int num = pdata->getvalue();
node *p = head;
while(num <= p->getNatda()->getvalue())
{
if (p->getyou() == NULL)
{
node *p1 = new node;
p1->setNada(pdata);
p->setyou(p1);
*(onew) +=1;
return;
}
p = p->getyou();
}
while (num > p->getNatda()->getvalue())
{
if (p->getzuo() == NULL)
{
node *p1 = new node;
p1->setNada(pdata);
p->setzuo(p1);
*(onew) +=1;
return;
}
p = p->getzuo();
}
}
data *find(int num);
void show_xianxu()
{
if (head == NULL)
{
return;
}
node*p=head;
while (p != NULL || !besk->is_emty())
{
if (p != NULL)
{
Push(p);
p->getNatda()->pint();
p = p->getyou();
continue;
}
else
{
p = besk->getST()->getNode();
Pop_stack();
p = p->getzuo();
}
}
}
void show_houxu()
{
if (head == NULL)
return;
node*p = head;
node*p1 = NULL;
while (p != NULL || !besk->is_emty())
{
if (p!=NULL)
{
Push(p);
p = p->getyou();
continue;
}
p = besk->getST()->getNode();
if (p->getzuo() == NULL || p->getzuo() == p1)
{
p1 = p;
p1->getNatda()->pint();
Pop_stack();
p = NULL;
}
else
{
p = p->getzuo();
}
}
}
void show_zhongxu()
{
if (head == NULL)
return;
node *p = head;
while (p != NULL || !besk->is_emty())
{
if (p != NULL)
{
Push(p);
p = p->getyou();
continue;
}
else
{
p = besk->getST()->getNode();
p->getNatda()->pint();
Pop_stack();
p = p->getzuo();
}
}
}
void show_Cenci()
{
if (head == NULL )
return;
node *p= head;
Pus_list(p);
while (p != NULL || !Lbesk->Lis_emty())
{
p = Lbesk->getLst()->Getnode();
p->getNatda()->pint();
if (p->getyou())
{
Pus_list(p->getyou());
}
if (p->getzuo())
{
Pus_list(p->getzuo());
}
Pop_list();
p = NULL;
}
}
void deleteall()
{
if (head == NULL )
return;
node *p = head;
Pus_list(p);
while (p != NULL || !Lbesk->Lis_emty())
{
p = Lbesk->getLst()->Getnode();
if (p->getyou())
{
Pus_list(p->getyou());
}
if (p->getzuo())
{
Pus_list(p->getzuo());
}
delete_Pop();
p = NULL;
}
}
void Push(node*one)
{
if (besk == NULL||!besk->getST())
{
if (besk == NULL)
{
besk = new Stack;
besk->SetConut();
}
Stack *p = new Stack;
p->SetNode(one);
besk->SetSt(p);
besk->addConut();
return;
}
Stack *p = new Stack;
p->SetNode(one);
p->SetSt(besk->getST());
besk->SetSt(p);
besk->addConut();
return;
}
void Pop_stack()
{
if (besk->is_emty())
return;
Stack *p = besk->getST();
besk->SetSt(p->getST());
besk->subConut();
delete p;
p = NULL;
}
void Pus_list(node*one)
{
if (Lbesk == NULL||!Lbesk->getLst())
{
if (Lbesk == NULL)
{
Lbesk = new List;
Lbesk->SetLconut();
}
List *p = new List;
p->SetLnode(one);
Lbesk->SetLst(p);
Lbesk->addLConut();
LSt = p;
return;
}
List *p = new List;
p->SetLnode(one);
LSt->SetLst(p);
LSt = p;
Lbesk->addLConut();
return;
}
void Pop_list()
{
if (Lbesk->Lis_emty())
return;
List *p = Lbesk->getLst();
Lbesk->SetLst(p->getLst());
Lbesk->subLConut();
delete p;
if (Lbesk->Lis_emty())
LSt = NULL;
}
void delete_Pop()
{
if (Lbesk->Lis_emty())
return;
if (!Lbesk->getLst()->getLst())
{
delete Lbesk->getLst()->Getnode();
Lbesk->getLst()->SetLnode(NULL);
delete Lbesk->getLst();
Lbesk->SetLst(NULL);
LSt = NULL;
Lbesk->subLConut();
if (Lbesk->Lis_emty())
head = NULL;
return;
}
delete Lbesk->getLst()->Getnode();
Lbesk->getLst()->SetLnode(NULL);
List *p = Lbesk->getLst();
Lbesk->SetLst(p->getLst());
delete p;
Lbesk->subLConut();
if (Lbesk->Lis_emty())
head = NULL;
return;
}
private:
int *onew;
Stack *besk;
node*head;
List *Lbesk;
List *LSt;
};
class re
{
public:
void inst(data *pdata)
{
l.inst(pdata);
}
void Run();
private:
S l;
};
void re::Run()
{
data *pdata = NULL;
int num;
int i = 0;
while (i != 7)
{
fflush(stdin);
cout << "\n输入2茶树节点数值:";
cin >> num;
pdata = new shu(num);
l.inst(pdata);
cout << i++ << endl;
if (i % 7 == 0)
{
cout << "\n先序遍历\n";
l.show_xianxu();
cout << "\n中序遍历\n";
l.show_zhongxu();
cout << "\n后续遍历\n";
l.show_houxu();
cout << "\n层次遍历\n";
l.show_Cenci();
}
}
}
void main()
{
re r;
r.Run();
}
本文介绍了一种使用C++实现的二叉树数据结构,并详细展示了如何通过递归和非递归的方式进行先序、中序和后序遍历,以及层次遍历的方法。此外,还提供了一个简单的程序来演示二叉树节点的插入和多种遍历方式。

被折叠的 条评论
为什么被折叠?



