思路:二叉树的题离不开遍历,上一题是层次遍历,这一次就是深度优先遍历,不过先排序的话应该会提高效率,我这里没排序;然后DFS要有回溯的思想,一条路走到底,行不通则返回一小段再走剩下的路;
#include <iostream>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void dfs(TreeNode *root, int sum, int target, bool &flag)
{
sum += root->val;
//边界条件,遇到叶子结点则进行判断并回溯
if (root->left == NULL && root->right == NULL) //若该结点为叶子结点
{
if (sum == target)
{
flag = true;
}
return;
}
//如果有孩子结点,继续深度优先搜索
if (root->left)
{
dfs(root->left, sum, target, flag);
}
if (root->right)
{
dfs(root->right, sum, target, flag);
}
}
bool hasPathSum(TreeNode *root, int sum)
{
if (root == NULL)
return false;
bool result = false;
dfs(root, 0, sum, result);
return result;
}
int main()
{
TreeNode *a1 = new TreeNode(5);
TreeNode *a2 = new TreeNode(4);
TreeNode *a3 = new TreeNode(8);
TreeNode *a4 = new TreeNode(11);
TreeNode *a5 = new TreeNode(13);
TreeNode *a6 = new TreeNode(4);
TreeNode *a7 = new TreeNode(7);
TreeNode *a8 = new TreeNode(2);
TreeNode *a9 = new TreeNode(1);
a1->left = a2;
a1->right = a3;
a2->left = a4;
a3->left = a5;
a3->right = a6;
a4->left = a7;
a4->right = a8;
a6->right = a9;
cout << hasPathSum(a1, 22) << endl;
return 0;
}