问题描述:采用先序遍历方法输出所有从叶子结点到根结点的逆路径。
输出结果如下:
二叉树 b:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))
先序遍历方法:
D 到根结点逆路径: D->B->A
J 到根结点逆路径: J->H->E->B->A
L 到根结点逆路径: L->K->H->E->B->A
N 到根结点逆路径: N->M->K->H->E->B->A
F 到根结点逆路径: F->C->A
I 到根结点逆路径: I->G->C->A
第一条最长逆路径长度:7
第一条最长逆路径:N M K H E B A
核心代码如下:
void PreOrderPrint_LeavesRoute(BiTree t)
{
static char stack[100];
static int i=0,level=0;
if(t)
{
stack[level++]=t->data;
if(t->lchild==NULL&&t->rchild==NULL)
{
i=level;
printf(" %c 到根结点逆路径: ",stack[i-1]);
while(i)
{
if(i>1)
printf("%c->",stack[--i]);
else
printf("%c\n",stack[--i]);
}
}
PreOrderPrint_LeavesRoute(t->lchild);
PreOrderPrint_LeavesRoute(t->rchild);
level--;
}
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int flag=1;
void pre_order_traveral_brackets1(BiTree t)
{
if(t)
{
printf("%c",t->data);
if(t->lchild||t->rchild)
{
printf("(");flag++;
}
pre_order_traveral_brackets1(t->lchild);
if(t->rchild)
printf(",");
pre_order_traveral_brackets1(t->rchild);
}
}
void pre_order_traveral_brackets(BiTree t)
{
if(t)
{
printf("%c",t->data);
printf("(");
pre_order_traveral_brackets1(t->lchild);
while(--flag)
{
printf(")");
}
printf(",");
pre_order_traveral_brackets1(t->rchild);
while(flag--+1)
{
printf(")");
}
}
}
void BiTreecreate(BiTree &t)
{
char ch;
char pch[]="ABD$$EHJ$$KL$$M$N$$$CF$$G$I$$";
static int i=0;
ch=pch[i++];
if(ch=='$')
t=NULL;
else
{
t=(BiTree)malloc(sizeof(BiTNode));
if(!t) exit(-1);
t->data=ch;
BiTreecreate(t->lchild);
BiTreecreate(t->rchild);
}
}
int BiTreedestroy(BiTree &t)
{
if(t)
{
if(t->lchild)
BiTreedestroy(t->lchild);
if(t->rchild)
BiTreedestroy(t->rchild);
free(t);
t=NULL;
}
return 1;
}
int max(int a,int b)
{
return a>b?a:b;
}
int Binary_tree_Deepness(BiTree t)//求深度
{
if(t==NULL)
return 0;
if(!t->lchild&&!t->rchild)
return 1;
else
return 1+max(Binary_tree_Deepness(t->lchild),Binary_tree_Deepness(t->rchild));
}
void PreOrderPrint_LeavesRoute(BiTree t)
{
static char stack[100];
static int i=0,level=0;
if(t)
{
stack[level++]=t->data;
if(t->lchild==NULL&&t->rchild==NULL)
{
i=level;
printf(" %c 到根结点逆路径: ",stack[i-1]);
while(i)
{
if(i>1)
printf("%c->",stack[--i]);
else
printf("%c\n",stack[--i]);
}
}
PreOrderPrint_LeavesRoute(t->lchild);
PreOrderPrint_LeavesRoute(t->rchild);
level--;
}
if(level==0)
{
i=Binary_tree_Deepness(t);
printf(" 第一条最长逆路径长度:%d\n",i);
printf(" 第一条最长逆路径:");
while(i)
{
printf("%c ",stack[--i]);
}
}
}
int main()
{
BiTree binarytree;
BiTreecreate(binarytree);
printf("二叉树 b:");
pre_order_traveral_brackets(binarytree);
printf("\n先序遍历方法:\n");
PreOrderPrint_LeavesRoute(binarytree);
BiTreedestroy(binarytree);//养成好习惯,有分配有释放
}