1.1 判断两颗树是否相同
LeetCode100:给定一个函数来判断两颗树是否相同,如果两棵树的结构相同并且相同结点的值一样,则说明两棵树相同。
实例如下:
上一章节我们学会了递归方式的二叉树的前序遍历,这里只要添加个结点判断条件,即可完成该题目。
判断结点相等条件有两个个:
①当两个结点的值为空时,则相等
②当结点的值相等时,则相等
其余情况下,结点都不相等,即两棵树不同
代码如下:
public static boolean isSameTree(TreeNode p, TreeNode q) {
//如果都为空我们就认为他是相同的
if (p == null && q == null)
return true;
//如果一个为空,一个不为空,很明显不可能是相同的树,直接返回false即可
if (p == null || q == null)
return false;
//如果这两个节点都不为空并且又不相等,所以他也不可能是相同的树,直接返回false
if (p.val != q.val)
return false;
//走到这一步说明节点p和q是完全相同的,我们只需要在比较他们的左右子节点即可
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
1.2 对称二叉树
LeetCode101:给定一个树,判断该树是否是对称的
实例如下:
我们可以把一颗数的两个孩子当成子树的两个根节点,这样该问题就可以变成判断两个数是否对称,和上面的题目就很相似了。
和上题不同的是,相同是看同侧,对称是看异侧,分为里侧和外侧。
外侧就是判断左节点的左孩子是否等于右节点的右孩子,
右侧就是判断左节点的右孩子是否等于右节点的左孩子。
代码和上题大差不差,代码如下:
public static boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return check(root.left, root.right);
}
public static boolean check(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p == null || q == null) {
return false;
}
if (p.val != q.val) {
return false;
}
return check(p.left, q.right) && check(p.right, q.left);
}
1.3 合并二叉树
LeetCode617:
将两个树的每个结点合并,如果两个结点不为空就相加为新的结点值,如果又一个为空,另一个结点就成为新的结点,如果都为空,则合并的也为空节点
代码如下:
public static TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
if (t1 == null) {
return t2;
}
if (t2 == null) {
return t1;
}
TreeNode merged = new TreeNode(t1.val + t2.val);
merged.left = mergeTrees(t1.left, t2.left);
merged.right = mergeTrees(t1.right, t2.right);
return merged;
}