二叉树结点路径

///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;
 }

///欢迎斧正和建议!

猜你喜欢

转载自www.cnblogs.com/Alic5/p/12711787.html