五月集训(第十八日)树

一、2236. 判断根结点是否等于子结点之和

1.原题链接

2236. 判断根结点是否等于子结点之和

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.原题链接

面试题 04.10. 检查子树

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.原题链接

面试题 04.06. 后继者

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.原题链接

1110. 删点成林

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;
    }
};

总结

        第十八天,继续加油。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枏念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值