二叉樹的路徑的和

/*
問題描述:給定一個二叉樹,找出所有路徑中各節點相加總和等於給定 目標值 的路徑。一個有效的路徑,指的是從根節點到葉節點的路徑。
來源:LintCode
作者:syt
日期:2017-11-10

*/

#include <iostream>

class TreeNode
{
public:
	int val;
	TreeNode *left, *right;
	TreeNode(){}
	TreeNode(int val, TreeNode *lptr = NULL, TreeNode *rptr = NULL) {
		this->val = val;
		this->left = lptr;
		this->right = rptr;
	}
};

#include "d_tree.h"
#include <vector>
using namespace std;

void calPathSum(TreeNode *node, vector<vector<int> > &result, vector<int> tmp, int target, int sum)
{
	if (node->right == NULL && node->left == NULL)
	{
		if (sum == target)
			result.push_back(tmp);
		return;
	}
	if (node->left != NULL)
	{
		tmp.push_back(node->left->val);
		calPathSum(node->left, result, tmp, target, sum + node->left->val);
		tmp.pop_back();
	}
	if (node->right != NULL)
	{
		tmp.push_back(node->right->val);
		calPathSum(node->right, result, tmp, target, sum + node->right->val);
		tmp.pop_back();
	}

}
/**
* @param root the root of binary tree
* @param target an integer
* @return all valid paths
*/
vector<vector<int>> binaryTreePathSum(TreeNode *root, int target) {
	// Write your code here
	vector<vector<int> > result;
	if (root != NULL)
	{
		int sum = root->val;
		vector<int> tmp = { root->val };
		calPathSum(root, result, tmp, target, sum);
	}
	return result;
}

TreeNode *buildTree(int n)
{
	TreeNode *root, *b, *c, *d, *e, *f, *g, *h;
	switch (n)
	{
	case 1:
		e = new TreeNode(3);
		d = new TreeNode(2);
		c = new TreeNode(4);
		b = new TreeNode(2, d, e);
		root = new TreeNode(1, b, c);
		break;
	case 2:
		h = new TreeNode(9);
		g = new TreeNode(7);
		f = new TreeNode(6);
		e = new TreeNode(5);
		d = new TreeNode(4, g, h);
		c = new TreeNode(3, e, f);
		b = new TreeNode(2, d, (TreeNode *)NULL);
		root = new TreeNode(1, b, c);
		break;
	}
	return root;
}
void main()
{
	TreeNode *root = buildTree(1);
	vector<vector<int> > result = binaryTreePathSum(root, 5);
	for (int i = 0; i < result.size(); i++)
	{
		for (int j = 0; j < result[i].size(); j++)
		{
			cout << result[i][j] << " ";
		}
		cout << endl;
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章