Skip to content

Commit 3597615

Browse files
committed
add lc medium
1 parent 17aaa8f commit 3597615

File tree

10 files changed

+381
-0
lines changed

10 files changed

+381
-0
lines changed

LeetCode/Medium/0429.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
// Definition for a Node.
3+
class Node {
4+
public:
5+
int val;
6+
vector<Node*> children;
7+
8+
Node() {}
9+
10+
Node(int _val) {
11+
val = _val;
12+
}
13+
14+
Node(int _val, vector<Node*> _children) {
15+
val = _val;
16+
children = _children;
17+
}
18+
};
19+
*/
20+
21+
class Solution {
22+
public:
23+
// 给定一个 N 叉树,返回其节点值的层序遍历
24+
vector<vector<int>> levelOrder(Node* root) {
25+
vector<vector<int>>ans;
26+
if(root == NULL) {
27+
return ans;
28+
}
29+
queue<Node*>que;
30+
que.push(root);
31+
while(!que.empty()) {
32+
int sz = que.size();
33+
vector<int>path;
34+
for(int i = 0; i < sz; i++) {
35+
Node* cur = que.front();
36+
que.pop();
37+
path.push_back(cur -> val);
38+
for(int j = 0; j < cur -> children.size(); j++) {
39+
que.push(cur -> children[j]);
40+
}
41+
}
42+
ans.push_back(path);
43+
}
44+
return ans;
45+
}
46+
};

LeetCode/Medium/0449.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8+
* };
9+
*/
10+
class Codec {
11+
public:
12+
// 序列化和反序列化
13+
// Encodes a tree to a single string.
14+
string serialize(TreeNode* root) {
15+
if(root == NULL) {
16+
return "#";
17+
}
18+
return to_string(root -> val) + " " + serialize(root -> left) + " " + serialize(root -> right);
19+
}
20+
TreeNode* rebuildTree(stringstream& data) {
21+
string str;
22+
data >> str;
23+
if(str == "#") {
24+
return NULL;
25+
}
26+
TreeNode* node = new TreeNode(stoi(str));
27+
node->left = rebuildTree(data);
28+
node->right = rebuildTree(data);
29+
return node;
30+
31+
}
32+
// Decodes your encoded data to tree.
33+
TreeNode* deserialize(string data) {
34+
stringstream ss(data);
35+
return rebuildTree(ss);
36+
}
37+
};
38+
39+
// Your Codec object will be instantiated and called as such:
40+
// Codec codec;
41+
// codec.deserialize(codec.serialize(root));

LeetCode/Medium/0450.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
8+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10+
* };
11+
*/
12+
class Solution {
13+
public:
14+
// 删除二叉树里的一个节点,然后输出新的二叉树
15+
TreeNode* deleteNode(TreeNode* root, int key) {
16+
if(root == NULL) {
17+
return NULL;
18+
}
19+
if(root -> val == key) {
20+
if(root -> left == NULL && root -> right == NULL) {
21+
return NULL;
22+
}
23+
if(root -> left == NULL) {
24+
return root -> right;
25+
}
26+
if(root -> right == NULL) {
27+
return root -> left;
28+
}
29+
// 将删除节点的左孩子放到删除节点的右孩子的最左面节点的左孩子的位置
30+
if(root -> left != NULL && root -> right != NULL) {
31+
TreeNode* cur = root -> right;
32+
while(cur -> left != NULL) {
33+
cur = cur -> left;
34+
}
35+
cur -> left = root -> left;
36+
root = root -> right;
37+
return root;
38+
}
39+
}
40+
if(root -> val > key) {
41+
root -> left = deleteNode(root -> left, key);
42+
}
43+
if(root -> val < key) {
44+
root -> right = deleteNode(root -> right, key);
45+
}
46+
return root;
47+
}
48+
};

LeetCode/Medium/0513.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
8+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10+
* };
11+
*/
12+
class Solution {
13+
public:
14+
// 找到二叉树最后一层最左的节点
15+
int findBottomLeftValue(TreeNode* root) {
16+
if(root == NULL) {
17+
return 0;
18+
}
19+
queue<TreeNode*>que;
20+
que.push(root);
21+
while(!que.empty()) {
22+
TreeNode* cur = que.front();
23+
root = cur;
24+
que.pop();
25+
if(cur -> right != NULL) {
26+
que.push(cur -> right);
27+
}
28+
if(cur -> left != NULL) {
29+
que.push(cur -> left);
30+
}
31+
}
32+
return root -> val;
33+
}
34+
};

LeetCode/Medium/0515.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
8+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10+
* };
11+
*/
12+
class Solution {
13+
public:
14+
vector<int> largestValues(TreeNode* root) {
15+
if(root == NULL) {
16+
return {};
17+
}
18+
queue<TreeNode*>que;
19+
que.push(root);
20+
vector<int>ans;
21+
while(!que.empty()) {
22+
int n = que.size();
23+
int max_val = INT_MIN;
24+
for(int i = 0; i < n; i++){
25+
TreeNode* cur = que.front();
26+
que.pop();
27+
max_val = max(max_val, cur -> val);
28+
if(cur -> left != NULL) {
29+
que.push(cur -> left);
30+
}
31+
if(cur -> right != NULL) {
32+
que.push(cur -> right);
33+
}
34+
}
35+
ans.push_back(max_val);
36+
}
37+
return ans;
38+
}
39+
};

LeetCode/Medium/0623.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
8+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10+
* };
11+
*/
12+
class Solution {
13+
public:
14+
// 给定一个二叉树,根节点为第1层,深度为 1。在其第 d 层追加一行值为 v 的节点。
15+
TreeNode* addOneRow(TreeNode* root, int v, int d) {
16+
if(root == NULL) {
17+
return NULL;
18+
}
19+
if(d == 1) {
20+
TreeNode* node = new TreeNode(v);
21+
node -> left = root;
22+
return node;
23+
}
24+
queue<TreeNode*>que;
25+
que.push(root);
26+
27+
int level = 2;
28+
29+
while(!que.empty()) {
30+
int sz = que.size();
31+
for(int i = 0; i < sz; i++) {
32+
TreeNode* cur = que.front(); // 第 d - 1 层
33+
que.pop();
34+
35+
if(d == level) {
36+
// 当前层指向新加的层,先处理左边,再处理右边
37+
TreeNode* tmp = cur -> left;
38+
cur -> left = new TreeNode(v);
39+
cur -> left -> left = tmp;
40+
41+
tmp = cur -> right;
42+
cur -> right = new TreeNode(v);
43+
cur -> right -> right = tmp;
44+
}
45+
46+
if(cur -> left != NULL) {
47+
que.push(cur -> left);
48+
}
49+
if(cur -> right != NULL) {
50+
que.push(cur -> right);
51+
}
52+
}
53+
level++;
54+
}
55+
return root;
56+
}
57+
};

LeetCode/Medium/0652.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
8+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10+
* };
11+
*/
12+
class Solution {
13+
public:
14+
// 给你一棵而测试,找到所有重复了的子树,同类型的就输出其中一个即可
15+
vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
16+
vector<TreeNode*>ans;
17+
unordered_map<string, int>mp;
18+
dfs(ans, mp, root);
19+
return ans;
20+
}
21+
string dfs(vector<TreeNode*>&ans, unordered_map<string, int>&mp, TreeNode* root) {
22+
if(root == NULL) {
23+
return "";
24+
}
25+
string str;
26+
str = to_string(root -> val) + " " + dfs(ans, mp, root -> left) + " " + dfs(ans, mp, root -> right);
27+
if(mp[str] == 1) {
28+
ans.push_back(root);
29+
}
30+
mp[str]++;
31+
return str;
32+
}
33+
};

LeetCode/Medium/0797 (dfs).cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
// 给你 N 个点的有向图,输出所有从 0 - N-1 的路径
4+
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
5+
vector<int>path;
6+
vector<vector<int>>ans;
7+
dfs(ans, path, graph,0);
8+
return ans;
9+
}
10+
void dfs(vector<vector<int>>&ans, vector<int>&path, vector<vector<int>>&graph, int node) {
11+
path.push_back(node);
12+
if(node == graph.size() - 1) {
13+
ans.push_back(path);
14+
}
15+
for(auto e: graph[node]) {
16+
dfs(ans, path, graph, e);
17+
}
18+
path.pop_back();
19+
}
20+
};

LeetCode/Medium/0814.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
8+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10+
* };
11+
*/
12+
class Solution {
13+
public:
14+
// 输出移除了所有不包含 1 的子树的原二叉树。
15+
TreeNode* pruneTree(TreeNode* root) {
16+
if(root == NULL) {
17+
return NULL;
18+
}
19+
TreeNode* left = pruneTree(root -> left);
20+
TreeNode* right = pruneTree(root -> right);
21+
if(left == NULL && right == NULL && root -> val == 0) {
22+
// ignore this node
23+
return NULL;
24+
}
25+
else {
26+
root -> left = left;
27+
root -> right = right;
28+
return root;
29+
}
30+
31+
}
32+
};

0 commit comments

Comments
 (0)