您的位置:首页 > 其它

flag2在二元树中找出和为某一值的所有路径 题目:输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如 输入整数

2018-01-21 21:42 573 查看
我写出了两种后续遍历,一种是递归,一种是非递归后续遍历,并且不毁坏原有二叉树。

可以输出任意一个二叉树叶子节点的路径长度,也可以达到题目要求!!

# include <stdio.h>

# include<malloc.h>

typedef struct tree

{

int data;

struct tree* lchild;

struct tree* rchild;

}Tree,*Ptree;

typedef struct node

{
Ptree data;
struct node* next;

}Node,*Pnode;

typedef struct stac

{

Pnode top,bottom;

}Stac,*Pstac;

void init(Pstac S);

void push(Pstac S,Ptree p);

Ptree pop(Pstac S);

bool isempty(Pstac S);

void travel(Ptree T);

Ptree gettop(Pstac S);

void travel2(Ptree T,Pstac S);

int travelS(Pstac S);

void main()

{

Stac S;

init(&S);

Ptree a=(Ptree)malloc(sizeof(Tree));

Ptree b=(Ptree)malloc(sizeof(Tree));

Ptree c=(Ptree)malloc(sizeof(Tree));

Ptree d=(Ptree)malloc(sizeof(Tree));

Ptree e=(Ptree)malloc(sizeof(Tree));

a->data=8;

b->data=1;

c->data=2;

d->data=6;

e->data=5;

a->lchild=b;

a->rchild=c;

b->lchild=NULL;

b->rchild=d;

c->lchild=e;

c->rchild=NULL;

d->lchild=NULL;

d->rchild=NULL;

e->lchild=NULL;

e->rchild=NULL;

//travel(a);

travel2(a,&S);

}

void init(Pstac S)

{

Pnode pnew=(Pnode)malloc(sizeof(Node));

S->bottom=pnew;

S->top=S->bottom;

pnew->next=NULL;

}

void push(Pstac S,Ptree p)

{

Pnode pnew=(Pnode)malloc(sizeof(Node));

pnew->data=p;

pnew->next=S->top;

S->top=pnew;

}

Ptree pop(Pstac S)

{

Ptree r =S->top->data;

S->top=S->top->next;

return r;

free(r);

}

bool isempty(Pstac S)

{

if(S->top==S->bottom)
return true;

else
return false;

}

Ptree gettop(Pstac S)

{

return S->top->data;

}

void travel(Ptree T)

{

if(T->lchild!=NULL)
travel(T->lchild);

printf("%d\n",T->data);

if(T->rchild!=NULL)
travel(T->rchild);

}

void travel2(Ptree T,Pstac S)

{

Ptree p,r;

p=T;

r=NULL;

while(p||!isempty(S))

{
if(p!=NULL)
{
push(S,p);
p=p->lchild;
}
else
{
p=gettop(S);
if(p->rchild&&p->rchild!=r)
{
p=p->rchild;
push(S,p);
p=p->lchild;
}
else
{
p=pop(S);
//printf("%d\n",p->data);
if(p->lchild==NULL&&p->rchild==NULL)
{
printf("%d\n",travelS(S)+p->data);
}

r=p;
p=NULL;
}
}

}

}

int travelS(Pstac S)

{

int sum=0;

Pnode p;

p=S->top;

while(p!=S->bottom)

{

sum+=p->data->data;

p=p->next;

}

return sum;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐