力扣练习——44 路径总和 III

44 路径总和 III

1.问题描述
给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

示例:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

  10

 /  \

5   -3

/ \ \

3 2 11

/ \ \

3 -2 1

返回 3。和等于 8 的路径有:

  1. 5 -> 3

  2. 5 -> 2 -> 1

  3. -3 -> 11

可使用以下main函数:

#include

#include

#include

#include

#include

using namespace std;

struct TreeNode

{

int val;

TreeNode *left;

TreeNode *right;

TreeNode() : val(0), left(NULL), right(NULL) {}

TreeNode(int x) : val(x), left(NULL), right(NULL) {}

TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

};

TreeNode* inputTree()

{

int n,count=0;

char item[100];

cin>>n;

if (n==0)

    return NULL;

cin>>item;

TreeNode* root = new TreeNode(atoi(item));

count++;

queue<TreeNode*> nodeQueue;

nodeQueue.push(root);

while (count<n)

{

    TreeNode* node = nodeQueue.front();

    nodeQueue.pop();

    cin>>item;

    count++;

    if (strcmp(item,"null")!=0)

    {

        int leftNumber = atoi(item);

        node->left = new TreeNode(leftNumber);

        nodeQueue.push(node->left);

    }

    if (count==n)

        break;

    cin>>item;

    count++;

    if (strcmp(item,"null")!=0)

    {

        int rightNumber = atoi(item);

        node->right = new TreeNode(rightNumber);

        nodeQueue.push(node->right);

    }

}

return root;

}

int main()

{

TreeNode* root;

root=inputTree();

int sum;

cin>>sum;

int res=Solution().pathSum(root,sum);

cout<<res<<endl;

}

2.输入说明
首先输入结点的数目n(注意,这里的结点包括题中的null空结点)

然后输入n个结点的数据,需要填充为空的结点,输入null。

最后输入一个整数sum。
3.输出说明
输出一个整数,表示结果。
4.范例
输入
11
10 5 -3 3 2 null 11 3 -2 null 1
8
输出
3
5.代码

#include <iostream>

#include <queue>

#include <cstdlib>

#include <cstring>

#include<map>

using namespace std;

struct TreeNode

{

	int val;

	TreeNode *left;

	TreeNode *right;

	TreeNode() : val(0), left(NULL), right(NULL) {}

	TreeNode(int x) : val(x), left(NULL), right(NULL) {}

	TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

};

TreeNode* inputTree()

{

	int n, count = 0;

	char item[100];

	cin >> n;

	if (n == 0)

		return NULL;

	cin >> item;

	TreeNode* root = new TreeNode(atoi(item));

	count++;

	queue<TreeNode*> nodeQueue;

	nodeQueue.push(root);

	while (count < n)

	{

		TreeNode* node = nodeQueue.front();

		nodeQueue.pop();

		cin >> item;

		count++;

		if (strcmp(item, "null") != 0)

		{

			int leftNumber = atoi(item);

			node->left = new TreeNode(leftNumber);

			nodeQueue.push(node->left);

		}

		if (count == n)

			break;

		cin >> item;

		count++;

		if (strcmp(item, "null") != 0)

		{

			int rightNumber = atoi(item);

			node->right = new TreeNode(rightNumber);

			nodeQueue.push(node->right);

		}

	}

	return root;

}

int rootSum(TreeNode *root, int sum)
{
	
	if (!root)//空树
		return 0;
	
	int res = 0;
	if (root->val == sum)//根节点正好等于sum 
		res++;

	res += rootSum(root->left, sum - root->val);//继续遍历左子树
	res += rootSum(root->right, sum - root->val);//继续遍历右子树
	return res;
}


int pathSum(TreeNode *root, int sum)
{
	
	if (!root)
		return 0;
	
	int res = rootSum(root, sum);//以该根节点开始遍历
	res += pathSum(root->left, sum);//以左子树为根节点开始遍历
	res += pathSum(root->right, sum);//以右子树为根节点开始遍历
	return res;
}


int main()

{

	TreeNode* root;

	root = inputTree();

	int sum;

	cin >> sum;

	int res = pathSum(root, sum);

	cout << res << endl;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值