1 题目描述
输入一颗二叉树和一个整数,打印出二叉树中节点值和为输入整数的所有路径。从输的根节点开始一直找到叶子节点所经过的节点形成一条路径。
2 解法描述
遍历二叉树的过程中累加二叉树元素之和,当当前遍历的节点为叶子节点时,判断累加值是否等于期望值,若等于打印当前路径并退回到其父节点继续遍历二叉树,否则直接退回到父节点继续遍历二叉树。
使用递归的方式完成方法的返回,从子节点遍历上下文退回到父节点遍历上下文,利用栈结构保存搜索路径。
3 C 语言实现
#include<stdio.h>
// Tree
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *lchild,*rchild;
}TNode,*Tree;
// Stack node1即为栈元素
typedef struct node1{
TNode* data;
struct node1 *next;
}SNode,*Stack;
//初始化头结点
void initStack(Stack* stack){
(*stack)=(SNode*)malloc(sizeof(SNode));
(*stack)->data=NULL;
(*stack)->next=NULL;
}
//所有操作都在表头进行,头插法
int push(Stack stack,TNode* data){
SNode *push;
//如果Stack尚未初始化
if(stack==NULL) return 0;
push=(SNode*)malloc(sizeof(SNode));
push->data=data;
push->next=stack->next;
stack->next=push;
}
//出栈
int pop(Stack stack,TNode** popVlaue){
//如果Stack为空
if(isEmpty(stack)) return 0;
SNode *pop=stack->next;
*popVlaue=pop->data;
stack->next=pop->next;
free(pop);
return 1;
}
//获得栈顶元素
int getTop(Stack stack,TNode** topVlaue){
//如果Stack为空
if(isEmpty(stack)) return 0;
*topVlaue=stack->next->data;
return 1;
}
//判断是否为空
int isEmpty(Stack stack){
return stack!=NULL&&stack->next==NULL?1:0;
}
//逆序输出栈中的元素
void showStack(Stack stack){
if(stack==NULL||isEmpty(stack)) return;
stack=stack->next;
showStack(stack);
printf("%d ",stack->data->data);
}
//创建二叉树
TNode* createTree(){
ElemType data;
scanf("%d",&data);
TNode* node;
if(data==0) return NULL;
node=(TNode*)malloc(sizeof(TNode));
node->data=data;
node->lchild=createTree();
node->rchild=createTree();
return node;
}
//先序遍历
void preOrder(TNode* node){
if(node==NULL) return;
printf("%d ",node->data);
preOrder(node->lchild);
preOrder(node->rchild);
}
void findPath_1(TNode* node,Stack stack,int currentSum,int expectedSum){
push(stack,node);
currentSum=currentSum+node->data;
if(node->lchild==NULL&&node->rchild==NULL&¤tSum==expectedSum){
printf("\ncurrentSum=expectedSum=%d",expectedSum);
printf("\n结果路径为:",expectedSum);
showStack(stack);
printf("\n");
}
if(node->lchild!=NULL){
findPath_1(node->lchild,stack,currentSum,expectedSum);
}
if(node->rchild!=NULL){
findPath_1(node->rchild,stack,currentSum,expectedSum);
}
TNode temp;
op(stack,&temp);
}
void findPath(TNode* node,int expectedSum){
Stack stack=NULL;
initStack(&stack);
if(node==NULL) return;
findPath_1(node,stack,0,expectedSum);
}
void main(){
Tree tree;
tree=NULL;
printf("%s:","请输入二叉树的元素");
tree=createTree();
printf("%s:","先序遍历二叉树的结果");
preOrder(tree);
findPath(tree,22);
}