在二元树中找出和为某一值的所有路径

题目:输入一个整数和一棵二元树。

从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。

打印出和与输入整数相等的所有路径。

例如 输入整数22和如下二元树

  10  

  / \   

 5  12   

 / \   

4  7

则打印出两条路径:10, 1210, 5, 7

 

二元树节点的数据结构定义为:

struct BinaryTreeNode // a node in the binary tree

{

int m_nValue; // value of node

BinaryTreeNode *m_pLeft; // left child of node

BinaryTreeNode *m_pRight; // right child of node

};

vs2008编译环境:

tree.h头文件如下:

using namespace std;
struct binaryTree
{
	int val;
	binaryTree *left;
	binaryTree *right;
	binaryTree(int t);
	
};
binaryTree::binaryTree(int t)
{
	val=t;
	left=right=NULL;
}

main.cpp文件如下:

#include<iostream>
#include"tree.h"
#include<queue>
using namespace std;
bool flag=false;
template<class T>
void find(binaryTree * temp,int sum,queue<typename T> que)//que记录路径的值 sum为路径和,每递归一层sum做相应减少。如要sum小于0还没到叶结点,则return.
{							//如果sum==0且为叶子结点,则有路径满足条件,并打出该路径
	if(temp->val>sum) return;
	if(temp->left==NULL &&temp->right==NULL) 
	{
		if(sum==temp->val)
		{
			que.push(temp->val);
			while(!que.empty()) 
			{
				cout<<que.front()<<" ";
				que.pop();
			}
			cout<<endl;
			flag=true;
			return;
		}	
		else
			return;
	}else
	{
		que.push(temp->val);
		find(temp->left,sum-temp->val,que);
		find(temp->right,sum-temp->val,que);
	}
}
void init()//查找路径和为22的所有路径
{
	binaryTree *root=new binaryTree(10);
	binaryTree * temp=new binaryTree(5);
	root->left=temp;
	temp->left=new binaryTree(4);
	temp->right=new binaryTree(7);
	root->right=new binaryTree(12);
	queue<int> que;

	find(root,22,que);
	cout<<(flag==true?"true":"false")<<endl;
}
int main()
{
	init();
	system("pause");
	return 0;
}

点赞