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;
}
可以输出任意一个二叉树叶子节点的路径长度,也可以达到题目要求!!
# 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;
}
相关文章推荐
- 输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
- 每天学习一算法系列(6) (输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径)
- <仅是自己做笔记。。。系列-4>输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径
- 每天学习一算法系列(6) (输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径)
- 面试题:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
- 输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
- 题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的结点形成一条路径。
- 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
- 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
- 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
- java 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
- 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
- 输入一个整数和一棵二元树。求出从根节点到叶节点的路径长度中与输入整数相等的所有路径。
- 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
- 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
- 输入一个整数和一棵二元树,打印出所有和为该整数的二元树中的路径
- 剑指offer_输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径
- 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径(剑指offer)
- java实现输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中