I'm a rookie in DS .今天上机实习了一下二叉树树根到任意一节点的路径的向大家汇报。

drmao 2003-10-29 09:06:49
////////////////////////////////////////////////////
////////////======stack.cpp===========/////////
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#define StaElem BiTree
#define Status int
#define BiTElem char
int ii=0;
////////////////////////////////////////////////////
typedef struct BiTNode{
BiTElem data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//////////////////////////////////////////////
typedef struct StaNode{
StaElem data;
struct StaNode *next;
}StaNode,*StaNodePtr;
typedef struct Stack{
StaNodePtr base,top;
}Stack;
//---------------------------------------------------//
Status InitStack(Stack &s){
if(s.base=s.top=(StaNodePtr)malloc(sizeof(StaNode)))
{s.base->next=0; return 1;}
else return 0;
}
//----------------------------------------------------//
Status Push(Stack &s,StaElem &e){
StaNodePtr push=(StaNodePtr)malloc(sizeof(StaNode));
s.top->data=e; push->next=s.top; s.top=push;
return 1;
}
//----------------------------------------------------//
Status StackEmpty(Stack &s){return s.top==s.base;}
//----------------------------------------------------//
Status GetTop(Stack &s,StaElem &e){
if(StackEmpty(s)){cout<<"\nSTACK EMPTY";return 0;}
e=s.top->next->data; return 1;
}//----------------------------------------------------//
Status Pop(Stack &s,StaElem &e){StaNodePtr temp=s.top->next;
if(StackEmpty(s)){cout<<"\nSTACK EMPTY";return 0;}
e=temp->data; free(s.top);s.top=temp; return 1;
}//----------------------------------------------------//
Status ClearStack(Stack &s){StaNodePtr temp=0;
while(s.top!=s.base){
temp=s.top->next; free(s.top); s.top=temp;
}return 1;
}//-----------------------------------------------------//
Status DestroyStack(Stack &s){ClearStack(s); free(s.base); return 1;
}//-----------------------------------------------------//

//*************************************************************************//
Status PreOrderCreatBiTree(BiTree &t){
if(!ii){cout<<"\nPreOrderCreatBiTree(BiTree &t)\n";++ii;}
BiTElem input; cin>>input;
if(input=='#')t=0;
else { t=(BiTree)malloc(sizeof(BiTNode));
t->data=input;
PreOrderCreatBiTree(t->lchild);
PreOrderCreatBiTree(t->rchild);
} return 1;//先序建立一个二叉树。递归。
}////////////////////////////////////////////////////////////
Status PreOrderTraverse(BiTree &t){//cout<<"\nInOrderTraverse(BiTree &t)\n";
if(t){cout<<" "<<t->data<<" ";//简单的先序遍历。
PreOrderTraverse(t->lchild);
PreOrderTraverse(t->rchild);}
return 1;
}///////////////
Status PreOrderTraverse_GetAPointer
(BiTree &t,BiTElem data,BiTree &p)
{
if(t){ if(t->data==data){ p=t; return 1;}
PreOrderTraverse_GetAPointer(t->lchild,data,p);
PreOrderTraverse_GetAPointer(t->rchild,data,p);
} return 0;//找到树中一个等于"data"的节点并用指针p指向它。
}///////////////
Status InOrderTraverse_stack(BiTree &t){
Stack s; StaElem p; InitStack(s);
Push(s,t);
while(!StackEmpty(s)){
while(GetTop(s,p)&&p){Push(s,p->lchild);}
Pop(s,p);
if(!StackEmpty(s)){
Pop(s,p); cout<<" "<<p->data;
Push(s,p->rchild);
}//if(!StackEmpty(s))
}DestroyStack(s);
return 1;//中序遍历(没有用到地归)////////
}///////////////
Status WhoIsMyParent
(BiTree &t,BiTree me,BiTree &parent)
{
Stack s; StaElem p; int amianorphan=1;//我是孤儿吗??
InitStack(s); Push(s,t);
while(!StackEmpty(s)){
while(GetTop(s,p)&&p){ Push(s,p->lchild);}
Pop(s,p);
if(!StackEmpty(s)){
Pop(s,p); //找到me节点的双亲并用parent指向它。
if(p->lchild==me||p->rchild==me)
{ parent=p; return 1;}
Push(s,p->rchild);//在遍历过程中找双亲。
}//if(!StackEmpty(s))
}DestroyStack(s);
return 0;
}///////////////////////////////////////////////////////
Status ARoadFromRootToP(BiTree &Root, BiTree &p){
BiTree parent=0;
Stack S; InitStack(S);
if(p==Root){
cout<<"\nTHE ROAD;"<<p->data; return 1;
}
if(!WhoIsMyParent(Root,p,parent))return 0;
else Push(S,p);
while(1){ Push(S,parent);
if(!WhoIsMyParent(Root,parent,parent))break;
};//路径入堆栈。
cout<<"\nTHE ROAD:"<<endl;
while(1){//打印堆栈中的路径出来。
Pop(S,parent); cout<<parent->data;
if(!StackEmpty(S))cout<<"--->";
else return 1;
}
}////////////////////////////////////////////////////////////////////
int main(){BiTree tree=0,p=0; char x;
PreOrderCreatBiTree(tree);
cout<<"\n你想打印从树根到那个节点的路径?";cin>>x;
PreOrderTraverse_GetAPointer(tree,x,p);
ARoadFromRootToP(tree,p);cout<<endl;//打印从根节点到p的路径。
InOrderTraverse_stack(tree);cout<<endl;
PreOrderTraverse(tree);
return 1;
}///////////////////////////////////////////////////////////////////
...全文
75 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
stephen85 2003-10-31
  • 打赏
  • 举报
回复
up
drmao 2003-10-31
  • 打赏
  • 举报
回复
I'm a new comer in the Data Structures area, If you find any thing wrong or improvable.please inform me without hesitation,I will appreciate that very much.
drmao 2003-10-31
  • 打赏
  • 举报
回复
I'm not very familiar with this forum can you tell me what means "up".??
zhouqingyuan 2003-10-30
  • 打赏
  • 举报
回复
收到
zhouqingyuan 2003-10-30
  • 打赏
  • 举报
回复
up
zhouqingyuan 2003-10-30
  • 打赏
  • 举报
回复
up,
drmao 2003-10-29
  • 打赏
  • 举报
回复
我自己看了有点头晕。

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧