一、路径总和2 LeetCode113
题目:
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
思路:
1、前序遍历每个节点时,将遍历的节点存进一个路径临时数组中,并用sum每个节点存储的数值进行累加,如果遍历到叶节点并且sum=0则将其存进结果数组中
2、前序遍历到一个叶节点后,则要再退回遍历其他路径。因此,后序遍历时,将路径临时数组中的最后一个节点弹出,并让sum加上临时数组的最后一个数
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> res;//存储最后结果
vector<int> path;//用来存储遍历的路径
// int value;//用来存储路径累加和
target_path(root,sum,res,path);//寻找目标路径
return res;
}
private:
void target_path(TreeNode* node,int sum,vector<vector<int>> &res,vector<int> &path){
if(!node){
return;
}
path.push_back(node->val);//将遍历到的节点的值push到路径
sum-=node->val;//将路径的值累加
if(!node->left && !node->right && sum==0){//判断目前存储的路径是否符合要求
res.push_back(path);
}
target_path(node->left, sum, res,path);//递归遍历左节点
target_path(node->right, sum, res,path);//再递归遍历右节点
path.pop_back();//遍历到叶节点后,再退回遍历其他节点
sum+=node->val;
}
};
二、二叉树最近公共祖先
题目:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1