二叉树中路径相关的问题一直是常考题,这也是深搜的问题。由于路径要从根节点开始,故也是一个先序遍历的问题。
不熟悉的话,建议看一下这几个例子,熟悉一下深度优先搜索和二叉树的遍历:DFS求全排列 DFS生成括号 二叉树的遍历
来看一下几道题目:
典型的递归深搜,如果对前面DFS的例子熟悉的话,很容易能解决。搜到了叶子结点,然后存入即可。
vector<string> binaryTreePaths(TreeNode* root) {
// Write your code here
vector<string> paths;
if(root==NULL) return paths;
allPath(root,paths,to_string(root->val));
}
void allPath(TreeNode * T,vector<string>& paths,string temp){
//左右节点均为空,则表明路径已经拼接完成
if(T->left==NULL&&T->right==NULL){
paths.push_back(temp);
}
if(T->left!=NULL)
allPath(T->left,paths,temp+"->"+to_string(T->left->val));
if(T->right!=NULL)
allPath(T->right,paths,temp+"->"+to_string(T->right->val));
}
再来看一个求和为指定值的路径的问题
最直接当然是保存一个的当前的和cur,依次增加,到达叶子的时候做出判断即可。为了省一个变量,我们用做减法的方式,减到叶子节点,tmp与叶子节点值相同,符合条件
vector<vector<int>> binaryTreePathSum(TreeNode *root, int target) {
// Write your code here
vector<vector<int>> result;
vector<int> cur;//保存中间结果
targetPath(root,result,cur,target);
return result;
}
void targetPath(TreeNode * root,vector<vector<int>>& result,vector<int>& cur,int tmp){
if(root==NULL) return;
cur.push_back(root->val);//不为空则访问
if(root->left==NULL&&root->right==NULL){//叶子节点
if(tmp == root->val)
result.push_back(cur);
}
targetPath(root->left,result,cur,tmp-root->val);
targetPath(root->right,result,cur,tmp-root->val);
cur.pop_back();
}
换个问法:判断和为target的路径是否存在?与上面相同,只是不需要保存路径的cur与tmp变量,找到一条即返回ture即可。