剑指Offer----面试题25:二叉树中和为某一值的路径

题目:


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

分析:




官方源代码:

/*
	题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
	从树的根节点往下一直到叶节点所经过的结点形成一条路径。
*/

#include"BinaryTree.h"
#include<vector>
#include<iostream>

using std::cout;
using std::endl;
using std::vector;

using namespace OrdinaryBinaryTreeSpace5;

void FindPath1(BinaryTreeNode *root, int exceptedSum);
void FindPath1(BinaryTreeNode *root, int exceptedSum, vector<int> &vec, int currentSum);

void FindPath1(BinaryTreeNode *root, int exceptedSum)
{
	//如果树为空,提示树为空
	if (root == NULL)
	{
		cout << "The tree is empty" << endl;
		return;
	}

	vector<int> vec;
	int currentSum = 0;
	FindPath1(root, exceptedSum, vec, currentSum);
}

void FindPath1(BinaryTreeNode *root, int exceptedSum, vector<int> &vec, int currentSum)
{
	//将该结点压入容器,因为是递归,所以用容器模拟的栈,用容器的原因是为了便于打印元素
	vec.push_back(root->element);
	currentSum += root->element;

	//如果是叶子结点且当前值等于期望的值,则打印输出各个结点
	if (currentSum == exceptedSum && root->left == NULL && root->right == NULL)
	{
		cout << "A path is found:";
		for (auto it = vec.begin(); it != vec.end(); it++)
			cout << *it << "  ";
		cout << endl;
	}
	
	//如果左子树为不为空,递归调用左子树
	if (root->left != NULL)
		FindPath1(root->left, exceptedSum, vec, currentSum);

	//如果右子树为不为空,递归调用右子树
	if (root->right != NULL)
		FindPath1(root->right, exceptedSum, vec, currentSum);

	//再返回父节点之后,在路径上删除当前结点
	vec.pop_back();
}

void test11()
{
	cout << "\t============二叉树中和为某一值的路径(存在)=============" << endl;
	BinaryTreeNode *node1 = CreateBinaryTreeNode(10);
	BinaryTreeNode *node2 = CreateBinaryTreeNode(5);
	BinaryTreeNode *node3 = CreateBinaryTreeNode(12);
	BinaryTreeNode *node4 = CreateBinaryTreeNode(4);
	BinaryTreeNode *node5 = CreateBinaryTreeNode(7);

	ConnectBinaryTreeNodes(node1, node2, node3);
	ConnectBinaryTreeNodes(node2, node4, node5);
	ConnectBinaryTreeNodes(node3, NULL, NULL);
	ConnectBinaryTreeNodes(node4, NULL, NULL);
	ConnectBinaryTreeNodes(node5, NULL, NULL);

	FindPath1(node1, 22);

	DestoryTree(node1);
}

void test12()
{
	cout << "\t============二叉树中和为某一值的路径(bu存在)=============" << endl;
	BinaryTreeNode *node1 = CreateBinaryTreeNode(10);
	BinaryTreeNode *node2 = CreateBinaryTreeNode(5);
	BinaryTreeNode *node3 = CreateBinaryTreeNode(12);
	BinaryTreeNode *node4 = CreateBinaryTreeNode(4);
	BinaryTreeNode *node5 = CreateBinaryTreeNode(7);

	ConnectBinaryTreeNodes(node1, node2, node3);
	ConnectBinaryTreeNodes(node2, node4, node5);
	ConnectBinaryTreeNodes(node3, NULL, NULL);
	ConnectBinaryTreeNodes(node4, NULL, NULL);
	ConnectBinaryTreeNodes(node5, NULL, NULL);

	FindPath1(node1, 9);

	DestoryTree(node1);
}

void test13()
{
	cout << "\t============二叉树中和为某一值的路径(树为空)=============" << endl;

	FindPath1(NULL, 9);
}

int main1()
{
	test11();
	cout << endl;

	test12();
	cout << endl;

	test13();
	cout << endl;

	system("pause");
	return 0;
}

运行结果:
Two paths should be found in Test1.
Test1 begins:
A path is found: 10     5       7
A path is found: 10     12

No paths should be found in Test2.
Test2 begins:

One path should be found in Test3.
Test3 begins:
A path is found: 5      4       3       2       1

No paths should be found in Test4.
Test4 begins:

One path should be found in Test5.
Test5 begins:
A path is found: 1

No paths should be found in Test6.
Test6 begins:

请按任意键继续. . .




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值