文章目录
一、今日刷题
1. 第七部分:二叉树 – 652. 寻找重复的子树
给定一棵二叉树 root,返回所有重复的子树。
对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
如果两棵树具有相同的结构和相同的结点值,则它们是重复的。
示例1输出中的4表示单个的叶子节点值的重复也算子树重复。
答案代码:
package BinaryTree;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* @author: LYZ
* @date: 2022/3/10 18:28
* @description: 652. 寻找重复的子树
*/
public class FindDuplicateSubtrees {
public static void main(String[] args) {
}
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
traverse(root);
return list;
}
HashMap<String, Integer> map = new HashMap<>();
List<TreeNode> list = new ArrayList<>();
public String traverse(TreeNode root) {
if (root == null) {
return "#";
}
//将左右子树序列化成字符串
String left = traverse(root.left);
String right = traverse(root.right);
String s = left + "," + right + "," + root.val;//用来描述以该节点为根的二叉树
int frequency = map.getOrDefault(s, 0);
if (frequency == 1) {
list.add(root);
}
map.put(s, frequency + 1);
return s;
}
}
总结
1.本题可以用来练习判断我们应该用前序还是中序还是后序遍历的框架。
根据题意,思考一个二叉树节点需要做什么,到底用什么遍历顺序就清楚了。
想知道以自己为根的子树是不是重复的,是否应该被加入结果列表中,
需要知道以下两点:
1、以我为根的这棵二叉树(子树)长啥样?
2、以其他节点为根的子树都长啥样?
2.Java 中数字和字符串拼接的问题:
String s = left + "," + right + "," + root.val;
root.val 本身是整型变量,但在字符串拼接时可以拼入字符串中:
1、数字拼接char,得到的还是数字,相当于和它的ASCII编码相加(如果定义成String 会编译错误)
2、数字拼接String,得到的是String
3、数字同时拼接char 和 String,就看和谁先拼接,和谁后拼接
4、String 拼接任何类型,得到的都是String
public static void main(String[] args) {
char c1 = 1 + 'a'; //这样其实属于"强制声明" 1 + 'a'的结果类型了,默认情况下,1 + 'a'的结果是98
System.out.println(c1);
System.out.println("*********************");
//1、数字拼接char,得到的还是数字,相当于和它的ASCII编码相加
int n1 = 1 + 'a';
System.out.println(n1);
System.out.println("*********************");
//2、数字拼接String,得到的是String
String s1 = 1 + "abc";
System.out.println(s1);
System.out.println("*********************");
//int n2 = 1 + "abc"; 报错
String s2 = "1" + "abc";
System.out.println(s2);
System.out.println("*********************");
//System.out.println(s1.equals(s2));
//3、数字同时拼接char 和 String,就看和谁先拼接,和谁后拼接
String s3 = 1 + 'a' + "abc";
System.out.println(s3);
System.out.println("*********************");
String s4 = 1 + "abc" + 'a';
System.out.println(s4);
System.out.println("*********************");
String s5 = 'a' + 1 + "abc";
System.out.println(s5);
}
输出结果为:
b
*********************
98
*********************
1abc
*********************
1abc
*********************
98abc
*********************
1abca
*********************
98abc
3.Java中equals()和==的区别
equals 是比较内存地址上面的值是否相同
== 是比较内存地址是否相同
******而且,equals 是针对引用数据类型的方法,取出内存地址中的值比较是否相同, 基本数据类型无equals方法
public static void main(String[] args) {
Integer aaa=new Integer(5);
Integer bbb=new Integer(5);
int a=10;
int b=10;
String str1=new String("justice");
String str2=new String("justice");
String str3;
str3=str1;
System.out.println(aaa==bbb);
System.out.println(aaa.equals(bbb));
System.out.println(a==b);
System.out.println("********************");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
System.out.println("********************");
System.out.println(str1==str3);
System.out.println(str1.equals(str3));
}
执行结果:
false
true
true
********************
false
true
********************
true
true
若为
Integer a = 5;
Integer b = 5;
则 a == b 的输出为 true, 因为定义一个Integer变量时,会默认进行Integer.valueOf(a)操作,查源码得当声明的包装类整型变量值在-128 - 127之间(整数缓冲区)时,其地址是相同的。