1.题目描述:给定二叉树和一个整数目标targetSum,输出所有从根结点到叶子结点的路径总和等于targetSun的路径。如下图
输入:
第一行输入t,表示有t个测试样例。
第二行起,每一行首先输入一个整数targetSum,接着输入n,接着输入n个整数代表一个二叉树。
以此类推共输入t个测试样例。
输出:
每一行输出一个符合题意的路径,若当前的二叉树没有符合题意的路径存在,则输出"Path not found"。
每个测试样例之间用一个空行隔开。
注意输出末尾的空格。
2.题目分析:
本人选择了最暴力的方法(蒟蒻的🧠比较直白),构建的话就正常的层序构建即可,可以参考其他博主的相关文章,如何找到目标值呢?可以利用先序遍历的思想:根节点->左子树->右子树,在遍历的过程中将节点都存放到一个栈里面,并且累计这一路加起来的总值,到叶子节点的时候就可以进行一次判断,等于目标值就输出,不是就返回,注意:返回时要在栈退出那个节点。然后接着存放下一个,重复刚刚的操作。
看看代码怎么实现的
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
struct Node
{
int data;
Node* left = NULL;
Node* right = NULL;
};
class Tree
{
private:
int target;//目标值
int stack_sum;//累计值
int state;//检测是不是输出路径了
Node* root;
stack<int> s;//存放和放出节点
stack<int> ans_s;//答案输出
public:
Tree();
void Sequeue_creation(Node*& node, int leng);//层序遍历构建二叉树
void find_path(Node* node);
void show();//简单的输出
};
Tree::Tree()
{
state = 0;
stack_sum = 0;
int length;
cin >> target;
cin >> length;
Sequeue_creation(root, length);
}
void Tree::Sequeue_creation(Node*& node, int leng)
{
int val, i = 0;
queue<Node*> q;
Node* temp;
while (i < leng)
{
cin >> val;
if (i == 0)
{
node = new Node;
node->data = val;
i++;
q.push(node);
continue;
}
temp = q.front();
if (val == -1)//此时为空
{
if (i % 2 == 1)//跟下面同理
{
temp->left = NULL;
}
if (i % 2 == 0)
{
temp->right = NULL;
q.pop();
}
i++;
}
else
{
Node* treenode = new Node;
treenode->data = val;
if (i % 2 == 1)//奇数表示为左节点
{
temp->left = treenode;
}
if (i % 2 == 0)//偶数为右节点
{
temp->right = treenode;
q.pop();//右节点结束了,必须退出一个,让下一个输出
}
i++;
q.push(treenode);
}
}
while (!q.empty())//这个可能有点多次一举了,目的是保证接下来的左右节点都是空
{
if (!q.front()->left) q.front()->left = NULL;
if (!q.front()->right) q.front()->right = NULL;
q.pop();
}
}
void Tree::find_path(Node* node)
{
if (node)
{
if (node->left == NULL && node->right == NULL)//叶子节点,开始返回
{
stack_sum = stack_sum + node->data;//加上
s.push(node->data);//存放
if (stack_sum == target)//成了,说明找到,开始输出
{
stack<int> temp = s;
while (!temp.empty())
{
ans_s.push(temp.top());
temp.pop();
}
while (!ans_s.empty())
{
cout << ans_s.top() << " ";
ans_s.pop();
}
state = 1;
cout << endl;
}
stack_sum = stack_sum - node->data;//离开叶子节点
s.pop();//离开时退栈
return;
}
else
{
s.push(node->data);
stack_sum = stack_sum + node->data;
find_path(node->left);
find_path(node->right);
//说明这个节点的两个左右节点都搞完了,退出该节点
stack_sum = stack_sum - node->data;//离开
s.pop();//离开后退栈
}
}
}
void Tree::show()
{
find_path(root);
if (state == 0) cout << "Path not found" << endl << endl;
else cout << endl;
}
int main(void)
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
Tree tree;
tree.show();
}
return 0;
}
(萌新写的,多多包容)