题目
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路
深度优先搜索。使用前序遍历,使用两个全局变量result和path,result来存放最终结果,path用来存放路径上的临时结果。
每次遍历,我们先把root的值压入path,然后判断当前root是否同时满足:
- 与给定数值相减为0; 左子树为空; 右子树为空。
如果满足条件,就将path压入result中,否则,依次遍历左右子树。需要注意的是,遍历左右子树的时候,全局变量path是不清空的,直到到了根结点才请空path。
问题理解的关键在于每次按照一条路径去查找,不管合不合适的时候,最后会将这个父节点pop出来,在重新找出新的路径。
想法:
现在这个问题是用递归去实现的,不断地找通过累加找那个我们访问到的结点的val。好,下一步,我们来整理下整个问题,假如现在的值已经相等,那么我们需要判断当前结点是否是叶子结点,如果是叶子结点已经找到了一条符合要求的路径,可以将这个路径保存下来了;反之再去访问当前结点的左右孩子结点……
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int target)
{
if (root == nullptr)
return result;
path.push_back(root->val);
if (target == root->val && root->left == nullptr && root->right == nullptr)
result.push_back(path);
if (root->left)
FindPath(root->left, target - root->val);
if (root->right)
FindPath(root->right, target - root->val);
path.pop_back();
return result;
}
private:
vector<vector <int>> result;
vector<int> path;
};
先序遍历,用非递归的方式实现
push()会将一个元素放入stack中。
top()会返回stack中的栈顶元素,返回的是reference,可以就地修改值。
pop()移除栈顶元素,无返回值。
size()返回stack长度。
empty()返回stack是否为空。
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
/*
*/
class Solution {
public:
//先序遍历,用栈实现
vector<int> preOrder(TreeNode *root)
{
vector<int> result;
if (root == nullptr)
return result;
stack<TreeNode *> s;
s.push(root);
TreeNode *temp;
while (s.size())
{
temp = s.top(); //temp暂存一下栈顶元素
result.push_back(temp->val);
s.pop();
if (temp->right)
s.push(temp->right);
if (temp->left)
s.push(temp->left);
}
return result;
}
};