☘前言☘
开更五月集训专题,由浅入深,深入浅出,飞向大厂!
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
⏳全文大约阅读时间: 20min
全文目录
2236. 判断根结点是否等于子结点之和
解题思路
一行代码完事
代码
class Solution {
public:
bool checkTree(TreeNode* root) {
return root->left->val + root-> right->val == root->val;
}
};
注意的点
注意符号优先级 符号优先级,优先级!!!!!
面试题 04.10. 检查子树
解题思路
有一个很好玩的思路,将一棵树转化为一个字符串,只要加上空指针,那么就是唯一确定的,所以直接用查找子串的方式来进行确定就完事了。
代码
class Solution {
void dfs(TreeNode* t,string &s){
if(t){
s += t->val + '0'; //记录字符串
dfs(t->left,s);
dfs(t->right,s);
}else{
s += 'n'; //空指针
}
}
public:
bool checkSubTree(TreeNode* t1, TreeNode* t2) {
string s1,s2;
dfs(t1,s1),dfs(t2,s2); //创建两个字符串
return s1.find(s2) != -1;
}
};
注意的点
- 找不到返回的位置是-1
面试题 04.06. 后继者
解题思路
如果到对应的元素就记录一下,然后下一个遍历到的记录结果。
代码
class Solution {
TreeNode *ret;
bool flag;
void nextZ(TreeNode* root, TreeNode* p){
if(root){
nextZ(root->left,p);
if(root == p) flag = true;
else if(flag) flag = false, ret = root;
nextZ(root->right,p);
}
}
public:
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
flag = false;ret = NULL;
nextZ(root,p);
return ret;
}
};
注意的点
不难
1110. 删点成林
解题思路
利用全局变量记录结果,然后判断如果祖先需要删除,并且当前节点不需要删除那么就是需要塞回结果。
代码
class Solution {
bool hash[1009];
vector<TreeNode*> ret; //返回结果数组
TreeNode* dfs(TreeNode* root,bool hasParent){
if(root == NULL) return NULL;
bool del = hash[root->val]; //判断是否删除
if(!del && !hasParent)
ret.push_back(root);
root->left = dfs(root->left,!del);
root->right = dfs(root->right,!del);
if(del) delete(root),root = NULL;
return root;
}
public:
vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
memset(hash,0,sizeof(hash));
for(auto del : to_delete) hash[del] = true; //hash初始化
ret.resize(0);
dfs(root,false);
return ret;
}
};
注意的点
看的脑子疼。
写在最后
大家加油!