!求二叉树中从根结点到叶子结点的路径

来源:互联网 发布:哇嘎左下角网络感叹号 编辑:程序博客网 时间:2024/04/27 13:40

/*exp7-3.cpp*/
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
 ElemType data;/*数据元素*/
 struct node *lchild;/*指向左孩子*/
 struct node *rchild;/*指向右孩子*/
}BTNode;
extern void CreateBTNode(BTNode * &b,char *str);/*在algo7-1.cpp文件中*/
extern void DispBTNode(BTNode *b);
void AllPath(BTNode *b)/*采用非递归方法输出从根结点到叶子结点的路径*/
{
 struct snode
 {
  BTNode *node;/*存放当前结点指针*/
  int parent;/*存放双亲结点在队列中的位置*/
 }Qu[MaxSize];/*定义顺序队列*/
 int front,rear,p;/*定义队头和队尾指针*/
 front=rear=-1;/*置队列为空队列*/
 rear++;
 Qu[rear].node=b;/*根结点指针进入队列*/
 Qu[rear].parent=-1;/*根结点没有双亲结*/
 while(front<rear)/*队列不定*/
 {
  front++;
  b=Qu[front].node;/*队头出队列*/
  if(b->lchild && b->rchild==NULL)/*b为叶子结点*/
  {
   printf("%c到根结点路径:",b->data);
   p=front;
   while(Qu[p].parent!=-1)
   {
    printf("  %c",Qu[p].node->data);
    p=Qu[p].parent;
   }
   printf("%c\n",Qu[p].node->data);
  }
  if(b->lchild!=NULL)/*左孩子入队列*/
  {
   rear++;
   Qu[rear].node=b->lchild;
   Qu[rear].parent=front;
  }
  if(b->rchild!=NULL)/*右孩子入队列*/
  {
   rear++;
   Qu[rear].node=b->rchild;
   Qu[rear].parent=front;
  }
 }
}

void AllPath1(BTNode *b,ElemType path[],int pathlen)/*采用递归方法输出从根结点到叶子结点的路径*/
{
 int i;
 if(b!=NULL)
 {
  if(b->lchild==NULL && b->rchild==NULL)/**b为叶子结点*/
  {
   printf("%c到根结点路径:%c",b->data,b->data);
   for(i=pathlen-1;i>=0;i--)
    printf("%c",path[i]);
   printf("\n");
  }
  else
  {
   path[pathlen]=b->data;/*将当前结点放入路径当中*/
   pathlen++;/*路径长度增加1*/
   AllPath1(b->lchild,path,pathlen);/*递归扫描左子树*/
   AllPath1(b->rchild,path,pathlen);/*递归扫描右子树*/
   pathlen--;/*恢复环境*/
  }
 }
}

void LongPath(BTNode *b,ElemType path[],int pathlen,ElemType longpath[],int &longpathlen)
{
 int i;
 if(b==NULL)
 {
  if(pathlen>longpathlen)/*若当前路径更长,将路径保存在longpath中*/
  {
   for(i=pathlen-1;i>=0;i--)
    longpath[i]=path[i];
   longpathlen=pathlen;
  }
 }
 else
 {
  path[pathlen]=b->data;/*将当前结点放入路径中*/
  pathlen++;/*路径长度增1*/
  LongPath(b->lchild,path,pathlen,longpath,longpathlen);/*递归扫描左子树*/
  LongPath(b->rchild,path,pathlen,longpath,longpathlen);/*递归扫描右子树*/
  pathlen--;/*恢复环境*/
 }
}

void DispLeaf(BTNode *b)/*输出叶子结点*/
{
 if(b!=NULL)
 {
  if(b->rchild==NULL && b->lchild==NULL)
   printf("%c",b->data);
  else
  {
   DispLeaf(b->lchild);
   DispLeaf(b->rchild);
  }
 }
}

void main()
{
 BTNode *b;
 ElemType path[MaxSize],longpath[MaxSize];
 int i,longpathlen=0;
 CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
 printf("二叉树b: ");DispBTNode(b);printf("\n\n");
 printf("b的叶子结点:");DispLeaf(b);printf("\n\n");
 printf("AllPath:\n");AllPath(b);printf("\n");
 printf("AllPath1:\n");AllPath1(b,path,0);printf("\n");
 LongPath(b,path,0,longpath,longpathlen);
 printf("第一条最长路径长度:%d\n",longpathlen);
 printf("第一条最长路径:");
 for(i=longpathlen;i>=0;i--)
  printf(" %c",longpath[i]);
 printf("\n");
}

原创粉丝点击