LeetCode 100、相同的树
题目:给定两个二叉树,编写一个函数来检验它们是否相同。
注:如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
[原题目链接:https://leetcode-cn.com/problems/same-tree/]
方法一:深度优先遍历
如果两个二叉树都为空,则两个二叉树是same tree,如果其中有一个是空,则必然不是same tree。如果两个二叉树一定不为空,如果是相同的树,则要求结构和val都相同,使用深度优先遍历来搜素,递归的判断两个二叉树是否相同。
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
} else if (p == null || q == null) {
return false;
} else if (p.val != q.val) {
return false;
} else {
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
}
方法二、广度优先遍历
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
} else if (p == null || q == null) {
return false;
}
Queue<TreeNode> queue1 = new LinkedList<TreeNode>();
Queue<TreeNode> queue2 = new LinkedList<TreeNode>();
queue1.offer(p);
queue2.offer(q);
while (!queue1.isEmpty() && !queue2.isEmpty()) {
TreeNode node1 = queue1.poll();
TreeNode node2 = queue2.poll();
if (node1.val != node2.val) {
return false;
}
TreeNode left1 = node1.left, right1 = node1.right, left2 = node2.left, right2 = node2.right;
if (left1 == null ^ left2 == null) {
return false;
}
if (right1 == null ^ right2 == null) {
return false;
}
if (left1 != null) {
queue1.offer(left1);
}
if (right1 != null) {
queue1.offer(right1);
}
if (left2 != null) {
queue2.offer(left2);
}
if (right2 != null) {
queue2.offer(right2);
}
}
return queue1.isEmpty() && queue2.isEmpty();
}
}
Notes:判断两个List是否相同,可以用:!list1.retainAll(list2);进行判断。