文章目录
一、2236. 判断根结点是否等于子结点之和
1.原题链接
2.题目描述
给你一个 二叉树 的根结点 root,该二叉树由恰好 3 个结点组成:根结点、左子结点和右子结点。如果根结点值等于两个子结点值之和,返回 true ,否则返回 false 。
3.解题思路
树的基本性质
4.源码
class Solution {
public:
bool checkTree(TreeNode* root) {
return root->val==root->left->val + root->right->val;
}
};
二、面试题 04.10. 检查子树
1.原题链接
2.题目描述
检查子树。你有两棵非常大的二叉树:T1,有几万个节点;T2,有几万个节点。设计一个算法,判断 T2 是否为 T1 的子树。如果 T1 有这么一个节点 n,其子树与 T2 一模一样,则 T2 为 T1 的子树,也就是说,从节点 n 处把树砍断,得到的树与 T2 完全相同。注意:此题相对书上原题略有改动。
3.解题思路
树+深度优先搜索
4.源码
class Solution {
public:
void dfs(TreeNode* t, string& s) //带空节点的前序遍历
{
if (t == nullptr)
{
s += 'x'; //若节点为空,则用x表示,任何其他字母也行
return;
}
s += t->val + '0';
dfs(t->left, s);
dfs(t->right, s);
}
bool checkSubTree(TreeNode* t1, TreeNode* t2) {
string s1 = "", s2 = "";
dfs(t1, s1), dfs(t2, s2); //构造代表两棵树的字符串
if (s1.find(s2) != string::npos)//判断 s1 是否包含 s2
{
return true;
}
else
{
return false;
}
}
};
三、面试题 04.06. 后继者
1.原题链接
2.题目描述
设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。如果指定节点没有对应的“下一个”节点,则返回null。
3.解题思路
中序递归遍历
4.源码
class Solution {
public:
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
if (!root) return nullptr;
if (root->val <= p-> val)
return inorderSuccessor(root->right, p);
TreeNode* findLeft = inorderSuccessor(root->left, p);
return findLeft ? findLeft : root;
}
};
四、1110. 删点成林
1.原题链接
2.题目描述
给出二叉树的根节点 root,树上每个节点都有一个不同的值。如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。返回森林中的每棵树。你可以按任意顺序组织答案。
3.解题思路
后序遍历数组+hash数组
4.源码
class Solution {
vector<TreeNode*>ans;
public:
vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
if(!root)return {};
auto m=find(to_delete.begin(),to_delete.end(),root->val);
if(m==to_delete.end()){
helper(root,to_delete);
ans.emplace_back(root);
return ans;
}
else{
helper(root,to_delete);
return ans;
}
}
bool helper(TreeNode* root,vector<int>& to_delete){
int k=0;
for(auto m=to_delete.begin();m!=to_delete.end();++m){
if(root->val==*m){
to_delete.erase(m);
k=1;
break;
}
}
if(root->left){
if(helper(root->left,to_delete)){
root->left=nullptr;
}
}
if(root->right){
if(helper(root->right,to_delete)){
root->right=nullptr;
}
}
if(k){
if(root->left)ans.emplace_back(root->left);
if(root->right)ans.emplace_back(root->right);
}
return k;
}
};
总结
第十八天,继续加油。