二叉树结点路径
///c语言
///按指示输入二叉树,并输入一个节点
///能得到根到该结点的路径
///本人的编程基础粗劣且笨拙,见谅
#include<stdio.h>
#include<stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
int flag; ///自制标志1||0
}BiTNode, *BiTree,*bitree;
typedef bitree SElemType;
typedef struct{ //顺序栈
SElemType *base;
SElemType *top;
int StackSize; //栈的当前已分配的存储空间
}SqStack;
SqStack s,w;//w用于储存路径
//先序建立二叉树
BiTree CreateTree()
{
char ch;
BiTree T;
scanf(“%c”,&ch);
if(ch==’#’) T=NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->flag = 1; //1表示未被访问
T->lchild = CreateTree();
T->rchild = CreateTree();
}
return T;//返回根节点
}
int InitStack (SqStack &S) //顺序栈的初始化MOOC
{ //构造一个空栈S
S.base=(SElemType *)malloc(100*sizeof(SElemType));
if(NULL==S.base) exit(-1); //存储分配失败
//if(NULL==S.base) exit(OVERFLOW); //存储分配失败,胡老师建议
S.top=S.base; //top初始为base
S.StackSize=10;
return 1;
}
int Push(SqStack &S,SElemType e)
//插入e为新的栈顶元素,如果栈空间不够,自动扩充(realloc函数)
{
if (S.top – S.base >= S.StackSize)
{
S.base = (SElemType *)realloc(S.base,(S.StackSize + 10)*sizeof(SElemType));
if(!S.base) return -1;//储存分配失败
S.top = S.base + S.StackSize;
S.StackSize += 10;
}
*S.top++=e; //元素e压入栈顶,栈顶指针加1 //栈顶不存元素
return 1;
}
int GetTop(SqStack S, SElemType &e)
{ //用e返回S的栈顶元素
if(S.top==S.base) return -1; //栈空
e=*(S.top-1);
return 1;
}
int Pop(SqStack &S, SElemType &e) //出栈,将栈顶元素删除
{ //删除S的栈顶元素,用e返回其值
if (S.top==S.base ) return -1;
e=*–S.top; //栈顶指针减1,将栈顶元素赋值给e //栈顶不存元素
return 1;
}
int Search2(bitree t,char &x,SqStack &w)//路径
{
bitree p = t,q = NULL,v;
p->flag = 0; //0表示已经被访问
Push(w,p);
while(1) //栈不空
{
if (p->data==x) //找到
{
break;
}
else if(p->lchild!=NULL&&p->lchild->flag != 0)//左
{
p->lchild->flag = 0; //0表示已经被访问
Push(w,p->lchild);
p=p->lchild;
}
else if ((p->lchild==NULL||p->lchild->flag==0)
&&p->rchild!=NULL)//右有
{
p->rchild->flag = 0; //0表示已经被访问
Push(w,p->rchild);
p=p->rchild;
}
else if (p->lchild==NULL&&p->rchild==NULL)//叶子结点
{
Pop(w,q);
GetTop(w,q);
p = q;
}
else
{
Pop(w,v);
GetTop(w,q);
p = q;
}
}
}
int main()
{
BiTree T,a;
int i = 0;
char x;
char as[100] = {0};
printf (“请输入树,叶子结点的孩子结点用#表示:\n”);
InitStack (s);
InitStack (w);
T = CreateTree();
getchar();
printf (“请输入检索字符:\n”);
scanf (“%c”,&x);
Search2(T,x,w);//寻找路径
while (w.base!=w.top)
{
Pop(w,a);
as[i] = a->data;
i++;
}
printf (“该结点路径为:”);
for (;i>=0;i–)
{//数组用于反向输出栈内的值
if (as[i]!=0&&i!=0)
printf (“%c->”,as[i]);
else
printf (“%c”,as[i]);
}
return 0;
}
///欢迎斧正和建议!