输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include<list>
#include<iterator>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;





struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
	val(x), left(NULL), right(NULL) {
	}
};
class Solution {
public:
	int sum = 0;
	vector<int> path;
	vector <vector<int>> paths;
	int flag = 0;

	vector<vector<int> > FindPath(TreeNode* root, int expectNumber) {

		paths = {};
		
		if (root != NULL)
		{ 
			FindOnePath(root, expectNumber);
		
		}
		
		
		///*if (root != NULL) FindOnePath(root, expectNumber);
		//	
		//else  paths = {};*/
		//
		return paths;
	}

	void FindOnePath(TreeNode* &root, int expectNumber) {
	
		if (root == NULL)
		{
			if(flag==0)

			{ 
			
			sum = 0;
			for (auto it = path.begin(); it != path.end(); ++it)
				sum += *it;
			if (sum == expectNumber)
			{
				paths.push_back(path);
			}
			flag = 1;
			}
			else
			{
				flag = 0;
			}
			return;

		}
		else
		{
			path.push_back(root->val);
			cout << "push:"<<root->val<<endl;
			FindOnePath(root->left, expectNumber); //第二次犯这个错误了,记住这里调用的是FindOnePath,而不是FindPath
			
			FindOnePath(root->right, expectNumber);
			path.pop_back();
			cout << "pop :" << root->val << endl;
		}
	
	}

	
	void CreateBiTree(TreeNode* &T) //这里的引用 & 必须,要不然会报未初始化变量
	{
		int num = 0;
		cin >> num;
		if (num == 0) return;
		else
		{
			T = new TreeNode(num);
			CreateBiTree(T->left);
			CreateBiTree(T->right);
		}
	}
	
};

int main()
{
	
	Solution so;
	TreeNode *T;
	so.CreateBiTree(T);
	cout << "创建二叉树成功!"<<endl;

	vector<vector<int>> vec;
	vec = so.FindPath(T,1);

	for (auto it = vec.begin(); it != vec.end(); it++)
	{
		for (auto i = (*it).begin(); i != (*it).end(); i++)
			cout << *i << "  ";
		cout << endl;
	}



	return 0;
}
posted @ 2016-10-24 13:47  wdan2016  阅读(1847)  评论(0编辑  收藏  举报