面试题34. 二叉树中和为某一值的路径(*)
题目描述: 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
- 解题思路:采用递归
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void find(TreeNode* root, int sum)
{
if (root == NULL)return;
path.push_back(root->val);
if (!root->left && !root->right && sum == root->val)
res.push_back(path);
else
{
if (root->left)
find(root->left, sum - root->val);
if (root->right)
find(root->right, sum - root->val);
}
path.pop_back();
}
vector<vector<int>> FindPath(TreeNode* root,int expectNumber) {
find(root, expectNumber);
return res;
}
};
面试题35. 复杂链表的复制(*)
题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
- 解题思路:采用map思路;
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
map<RandomListNode*, RandomListNode*> mp;
set<RandomListNode*> vis;
void dfs1(RandomListNode* u){
if(u && mp.find(u) == mp.end()) {
mp[u] = new RandomListNode(u -> label);
dfs1(u -> next);
dfs1(u -> random);
}
}
void dfs2(RandomListNode* u){
if(u && vis.find(u) == vis.end()){
if(u -> next) mp[u] -> next = mp[u -> next];
if(u -> random) mp[u] -> random = mp[u -> random];
vis.insert(u);
dfs2(u -> next);
dfs2(u -> random);
}
}
public:
RandomListNode* Clone(RandomListNode* pHead){
if(!pHead) return NULL;
mp.clear();
vis.clear();
dfs1(pHead);
dfs2(pHead);
return mp[pHead];
}
};