【路径问题】
问题描述:采用先序遍历方法输出所有从叶子结点到根结点的逆路径。
二叉树 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
dfs和bfs都可以输出路径,但是二者也有所不同。bfs主要是队列,先进先出。而dfs则可以回来,用一个数组存储就可以了。写这个题目的时候,我想到了深搜的入门题,素数环。。可以来参考一下
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
char data;
struct node *lchild;
struct node *rchild;
int vis;
} *Bitree;
void creatree(Bitree &t)
{
char c;
cin>>c;
if(c=='#') t=NULL;
else
{
t=(node *)malloc(sizeof(node));
t->data=c;
t->vis=0;
creatree(t->lchild);
creatree(t->rchild);
}
}
char s[1010];
char s1[1010];
int cnt=0;
int maxx=-1;
void dfs(Bitree &t)
{
if(t!=NULL)
{
s[cnt++]=t->data;
if(t->lchild==NULL&&t->rchild==NULL)
{
printf("从%c到%c的路径为:\n",s[cnt-1],s[0]);
for(int i=cnt-1;i>=0;i--)
{
cout<<s[i];
if(i) cout<<"->";
}
if(maxx<cnt)
{
maxx=cnt;
strcpy(s1,s);
}
cnt--;//cnt为全局变量,在这里需要减一。
cout<<endl;
return ;
}
dfs(t->lchild);
dfs(t->rchild);
cnt--;//当一个节点以下的走完了以后,就cnt--,去找寻上面的节点、
}
}
int main()
{
Bitree t;
creatree(t);
dfs(t);
cout<<"第一条最长逆路径长度:"<<maxx<<endl;
for(int i=maxx-1;i>=0;i--) cout<<s1[i]<<" ";
}
//ABD##EHJ##KL##M#N###CF##G#I##
努力加油a啊,(o)/~