前言:
五月集训,前面为学习内容,想要一起学习的可以看一看,最后的才是五月集训每天的作业。
一、知识点
一般来讲,树中每个节点都包含一个值和两个子节点(子节点可能为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);
}
}
}
四、总结
对于算法的掌握还是不够熟练,需要进行反复训练!
另外,剩下的课堂训练题目留到下个月的集训啦(●ˇ∀ˇ●)