《五月集训》(第18天)——树

前言:

五月集训,前面为学习内容,想要一起学习的可以看一看,最后的才是五月集训每天的作业。

一、知识点

一般来讲,树中每个节点都包含一个值和两个子节点(子节点可能为null)。

二、课堂习题

这里的题均出自《算法零基础100讲》
英雄哥专栏很好滴哟。

三、作业

2236. 判断根结点是否等于子结点之和
面试题 04.10. 检查子树
面试题 04.06. 后继者
1110. 删点成林
解题思路:
1.深搜遍历树,将所有子节点之和与根节点进行比较即可;
2.层序遍历+dfs,判断每个节点之后的树枝,是否与t2树相同;
3.假设树中有答案的话,后继者大于当前节点,那么一定在右子树中,否则在左子树中,不断寻找若最后为空则没有这个答案;
4.dfs+哈希表即可。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int cnt = 0;
    public boolean checkTree(TreeNode root) {
        dfs(root);
        if(root.val == cnt-root.val) return true;
        return false;
    }
    public void dfs(TreeNode root){
        cnt += root.val;
        if(root.left != null){
            dfs(root.left);
        }
        if(root.right != null){
            dfs(root.right);
        }
    }
}
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean checkSubTree(TreeNode t1, TreeNode t2) {
        boolean ans = false;
        Queue<TreeNode> q = new ArrayDeque<>();
        q.offer(t1);
        while(!q.isEmpty()){
            int n = q.size();
            for(int i = 0;i < n;i++){
                TreeNode node = q.poll();
                if(node.left != null)   q.offer(node.left);
                if(node.right != null)  q.offer(node.right);
                if(ans = dfs(node,t2))  return ans;
            }
        }
        return ans;
    }
    public boolean dfs(TreeNode t1,TreeNode t2){
        if(t1 == null && t2 == null)  return true;
        if(t2.val != t1.val || t1 == null || t2 == null)  return false;
        return dfs(t1.left,t2.left) && dfs(t1.right,t2.right);
    }
}
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        TreeNode ans = dfs(root,p);
        return ans;
    }
    public TreeNode dfs(TreeNode node,TreeNode p){
        if(node == null)    return null;
        if(p.val >= node.val)   return dfs(node.right,p);
        TreeNode temp = dfs(node.left,p);
        return temp == null ? node : temp;
    }
}
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<TreeNode> ans = new ArrayList<>();
    public List<TreeNode> delNodes(TreeNode root, int[] to_delete){
        Set<Integer> set = new HashSet<>();
        for(int d : to_delete)  set.add(d);
        dfs(null, root, set);
        if(!set.contains(root.val)) ans.add(root);
        return ans;
    }
    private void dfs(TreeNode node, TreeNode root, Set<Integer> set){
        if(root == null)    return;
        dfs(root, root.left, set);
        dfs(root, root.right, set);
        if(set.contains(root.val)){
            if(node != null && node.left == root) node.left = null;
            if(node != null && node.right == root) node.right = null;
            if(root.left != null) ans.add(root.left);
            if(root.right != null) ans.add(root.right);
        }
    }
}

四、总结

对于算法的掌握还是不够熟练,需要进行反复训练!
另外,剩下的课堂训练题目留到下个月的集训啦(●ˇ∀ˇ●)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值