跪求大神帮我把下面的C语言改为C++,并输出其前驱和后继
#include<iostream.h>#include<stdlib.h>#include<stdio.h>constintOVERFLOW=0;typedefenum...
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
const int OVERFLOW=0;
typedef enum PointerTag{LINK=0,THREAD=1};
struct BiThrNode
{
char data;
BiThrNode *lchild, *rchild;
PointerTag LTag, RTag;
};
typedef struct BiThrNode BiThrNode;
typedef BiThrNode * BiThrTree;
void CreateBiTree(BiThrTree &T)
{
char ch;
ch= getchar();
if(ch=='#') T=NULL;
else{
if(!(T = (BiThrNode *)malloc(sizeof(BiThrNode)))) exit(OVERFLOW);
T->data= ch;
T->LTag = LINK;
T->RTag = LINK;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return;
}//CreateBiTree
void PrintBiTree(BiThrTree T)
{
if(T)
{
PrintBiTree(T->lchild);
cout<<T->data;
//cout<<T->data;
PrintBiTree(T->rchild);
}
return;
}//PrintBiTree
void InThreading(BiThrTree p,BiThrNode * &pre)
{
if(p){
InThreading(p->lchild,pre);
if(!p->lchild){
p->LTag= THREAD;
p->lchild= pre;
}
if(!pre->rchild){
pre->RTag= THREAD;
pre->rchild= p;
}
pre= p;
InThreading(p->rchild,pre);
}
}//InThreading
void InOrderThreading(BiThrTree& ThrT, BiThrTree T)
{
BiThrNode* pre;
if(!(ThrT = (BiThrNode *)malloc(sizeof(BiThrNode)))) exit(OVERFLOW);
ThrT->LTag= LINK;
ThrT->RTag= THREAD;
ThrT->rchild= ThrT;
if(!T) ThrT->lchild = ThrT;
else{
ThrT->lchild= T;
pre= ThrT;
InThreading(T,pre);
pre->rchild= ThrT;
pre->RTag= THREAD;
ThrT->rchild= pre;
}
return;
}//InOrderThreading
void InOrderTraverse_Thr(BiThrTree T)
{
BiThrNode*p;
p= T->lchild;
while(p != T)
{
while(p->LTag == LINK) p = p->lchild;
cout<<p->data;
//cout<<p->data;
while(p->RTag == THREAD && p->rchild != T)
{
p= p->rchild;
cout<<p->data;
//cout<<p->data;
}
p= p->rchild;
}
return ;
}//InOrderTraverse_Thr
InorderPre(BiThrTree p)
{// 在中序线索二叉树中找结点p的中序前驱结点
BiThrTree q;
if (p->LTag==1) // 结点的左子树为空
return p->lchild->data; //结点的左指针域为左线索,指向其前驱
else
{
q=p->lchild; //p结点左子树中最右边结点是P结点的中序前驱
while (q->RTag!=NULL) q=q->rchild;
return (q->data);
} // if
} // InorderPre
//中序后继: 若rtag=1,rchild指向其后继;否则,该结点的后驱是以该结点为根的右子树上按中序遍历的第一个结点。
InorderNext(BiThrTree p)
{// 在中序线索二叉树中找结点p的中序后继结点
BiThrTree q;
if (p->RTag==1) // 结点的右子树为空
return(p->rchild->data); //结点的右指针域为右线索,指向其后继
else
{q=p->rchild; //p结点的右子树中最左边结点是P结点的中序后继
while (q->LTag ) q=q->lchild;
return (q->data);
} // if
} // InorderNext 展开
#include <stdlib.h>
#include <stdio.h>
const int OVERFLOW=0;
typedef enum PointerTag{LINK=0,THREAD=1};
struct BiThrNode
{
char data;
BiThrNode *lchild, *rchild;
PointerTag LTag, RTag;
};
typedef struct BiThrNode BiThrNode;
typedef BiThrNode * BiThrTree;
void CreateBiTree(BiThrTree &T)
{
char ch;
ch= getchar();
if(ch=='#') T=NULL;
else{
if(!(T = (BiThrNode *)malloc(sizeof(BiThrNode)))) exit(OVERFLOW);
T->data= ch;
T->LTag = LINK;
T->RTag = LINK;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return;
}//CreateBiTree
void PrintBiTree(BiThrTree T)
{
if(T)
{
PrintBiTree(T->lchild);
cout<<T->data;
//cout<<T->data;
PrintBiTree(T->rchild);
}
return;
}//PrintBiTree
void InThreading(BiThrTree p,BiThrNode * &pre)
{
if(p){
InThreading(p->lchild,pre);
if(!p->lchild){
p->LTag= THREAD;
p->lchild= pre;
}
if(!pre->rchild){
pre->RTag= THREAD;
pre->rchild= p;
}
pre= p;
InThreading(p->rchild,pre);
}
}//InThreading
void InOrderThreading(BiThrTree& ThrT, BiThrTree T)
{
BiThrNode* pre;
if(!(ThrT = (BiThrNode *)malloc(sizeof(BiThrNode)))) exit(OVERFLOW);
ThrT->LTag= LINK;
ThrT->RTag= THREAD;
ThrT->rchild= ThrT;
if(!T) ThrT->lchild = ThrT;
else{
ThrT->lchild= T;
pre= ThrT;
InThreading(T,pre);
pre->rchild= ThrT;
pre->RTag= THREAD;
ThrT->rchild= pre;
}
return;
}//InOrderThreading
void InOrderTraverse_Thr(BiThrTree T)
{
BiThrNode*p;
p= T->lchild;
while(p != T)
{
while(p->LTag == LINK) p = p->lchild;
cout<<p->data;
//cout<<p->data;
while(p->RTag == THREAD && p->rchild != T)
{
p= p->rchild;
cout<<p->data;
//cout<<p->data;
}
p= p->rchild;
}
return ;
}//InOrderTraverse_Thr
InorderPre(BiThrTree p)
{// 在中序线索二叉树中找结点p的中序前驱结点
BiThrTree q;
if (p->LTag==1) // 结点的左子树为空
return p->lchild->data; //结点的左指针域为左线索,指向其前驱
else
{
q=p->lchild; //p结点左子树中最右边结点是P结点的中序前驱
while (q->RTag!=NULL) q=q->rchild;
return (q->data);
} // if
} // InorderPre
//中序后继: 若rtag=1,rchild指向其后继;否则,该结点的后驱是以该结点为根的右子树上按中序遍历的第一个结点。
InorderNext(BiThrTree p)
{// 在中序线索二叉树中找结点p的中序后继结点
BiThrTree q;
if (p->RTag==1) // 结点的右子树为空
return(p->rchild->data); //结点的右指针域为右线索,指向其后继
else
{q=p->rchild; //p结点的右子树中最左边结点是P结点的中序后继
while (q->LTag ) q=q->lchild;
return (q->data);
} // if
} // InorderNext 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询