题目来源:微软面试100题:
在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和10, 5, 7。
#include <iostream>
using namespace std;
/*二叉查找树结构*/
typedef struct BSTree
{
int node_value;
struct BSTree * left;
struct BSTree * right;
}Tree;
/*****构造二叉查找树**********************************************/
void CreateBSTree(Tree * root,int node_value);
Tree * CreateBSTree(int * array_list,int array_length);
bool Pop();
void Print();
void Print(Tree* root);
bool CheckSum();
/***************************************************************/
#define MAX_SIZE 100
int tmp [MAX_SIZE]={0};
int length = 0;
int sum = 22;
/***************************************************************/
int main(int argc,char * argv)
{
Tree * root = NULL;
int list[]={10,5,12,4,7};
root = CreateBSTree(list,5);
Travel(root);
getchar();
return 0;
}
/*生成二叉查找树*/
Tree * CreateBSTree(int * array_list,int array_length)
{
if(array_length <= 0)
{
return false;
}
Tree * root = NULL;
root = new BSTree();
root->left = NULL;
root->right = NULL;
root->node_value = array_list[0];
for(int i=1;i<array_length;i++)
{
CreateBSTree(root,array_list[i]);
}
return root;
}
/*生成二叉查找树*/
void CreateBSTree(Tree * root,int node_value)
{
if(root == NULL)
{
return ;
}
if(root->node_value > node_value)
{
if(root->left == NULL)
{
Tree * node = new Tree();
node->left = NULL;
node->right = NULL;
node->node_value = node_value;
root->left = node;
}
else
{
CreateBSTree(root->left,node_value);
}
}
else
{
if(root->right == NULL)
{
Tree * node = new Tree();
node->left = NULL;
node->right = NULL;
node->node_value = node_value;
root->right = node;
}
else
{
CreateBSTree(root->right,node_value);
}
}
}
/**********************************************************/
/**********************************************************/
void Travel(Tree* root)
{
if(root == NULL)
{
return ;
}
tmp[length] = root->node_value;
length ++;
Travel(root->left);
Travel(root->right);
if(CheckSum())
{
Print();
}
else
{
Pop();
}
}
/*输出符合要求的路径*/
void Print()
{
std::cout<<std::endl;
for(int i=0;i<length;i++)
{
std::cout<<tmp[i]<<"\t";
}
Pop();
}
bool Pop()
{
if(length > 0)
{
tmp[length] = 0;
length --;
return true;
}
else
{
return false;
}
}
/*检查路径之和*/
bool CheckSum()
{
int s = 0;
for(int i=0;i<length;i++)
{
s += tmp[i];
}
if(s == sum)
{
return true;
}
else
{
return false;
}
}