<pre name="code" class="cpp">/*
4.在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数 22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和 10, 5, 7。
方法主要用回溯法和递推
*/
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define MAX 20
struct BTreeNode{
int data;
BTreeNode *left,*right;
};
//建立二叉树
BTreeNode * CreateTree(int data[],int pos,int len)
{
BTreeNode *tree;
if(pos>=len)
{
return NULL;
}
else
{
tree=(BTreeNode *)malloc(sizeof(BTreeNode));
tree->data=data[pos];
tree->left=CreateTree(data,2*pos+1,len);//数组坐标
tree->right=CreateTree(data,2*pos+2,len);
return tree;
}
}
//这里复习一下三种遍历
void preOrder(BTreeNode *tree)
{
if(tree!=NULL)
{
printf("%d ",tree->data);
preOrder(tree->left);
preOrder(tree->right);
}
}
void InOrder(BTreeNode *tree)
{
if(tree!=NULL)
{
InOrder(tree->left);
printf("%d ",tree->data);
InOrder(tree->right);
}
}
void BaOrder(BTreeNode *tree)
{
if(tree!=NULL)
{
BaOrder(tree->left);
BaOrder(tree->right);
printf("%d ",tree->data);
}
}
void printPath(int path[],int top)
{
int i;
for(i=0;i<top;i++)
printf("%d ",path[i]);
printf("\n");
}
void findPath(BTreeNode *root,int sum,int path[],int top)
{
path[top++]=root->data;
sum-=root->data;
if(root->left==NULL&&root->right==NULL)
{
if(sum==0) printPath(path,top);
}
else
{
if(root->left!=NULL) findPath(root->left,sum,path,top);
if(root->right!=NULL) findPath(root->right,sum,path,top);
}
top--;
sum+=root->data;
}
int main(){
int data[]={10,5,12,4,7};
int len=sizeof(data)/sizeof(int);
//这里复习一下三种遍历
BTreeNode *tree=CreateTree(data,0,len);
printf("前序遍历:\n");
preOrder(tree);printf("\n");
printf("中序遍历:\n");
InOrder(tree);printf("\n");
printf("后序遍历:\n");
BaOrder(tree);printf("\n");
int sum=22;
int top=0;
int path[MAX]={0};
findPath(tree,sum,path,top);
return 0;
}