思路:通过非递归的后序遍历算法。将访问的结点改成,判断该结点是否是叶子结点,如果是则输出栈中所有的结点,即为从根节点到该叶子结点的路径逆序列。
这里用先序遍历创建二叉树,例如:ABD#G###CE##F##
输出:
G->D->B->A
E->C->A
F->C->A
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
//1.假设二叉树采用二叉链存储结构,设计一个算法输出从根节点到每个叶子节点的路径逆序列
//即求叶子节点及其所有祖先节点的序列
typedef struct BiTNode
{
char data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode,*BiTree;
//创建二叉树---先序创建二叉树 这里用的先序遍历树应该输入ABD#G###CE##F##
void CreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch == '#')
{
T=NULL;
}
else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return ;
}
//通过后序遍历非递归算法 判断结点是否为叶子结点,若是叶子结点,则输出栈中所有结点的值(即从根节点到该叶子节点的路径逆序列)
void back_path(BiTree &T)
{
BiTree S[MaxSize],p;
int top=-1;
bool flag;
if(!T)
{
return ;
}
do{
while(T != NULL)
{
S[++top]=T;
T=T->lchild;
}
p=NULL;
flag = 1;
while(top != -1 && flag)
{
T = S[top]; //取出栈顶元素
if(T->rchild == p)
{
if(T->lchild == NULL && T->rchild == NULL)
{
for(int i=top;i>0;i--)
{
printf("%c->",S[i]->data);
}
printf("%c\n",S[0]->data);
}
top--;
p=T;
}
else{
T=T->rchild;
flag=0;
}
}
}while(top != -1);
printf("\n");
}
int main()
{
BiTree T;
CreateBiTree(T);
back_path(T);
return 0;
}