问题描述:
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] 输出: true
示例 2:
输入: 1 1 / \ 2 2 [1,2], [1,null,2] 输出: false
示例 3:
输入: 1 1 / \ / \ 2 1 1 2 [1,2,1], [1,1,2] 输出: false
tmd,写了40分钟,写出了一个非递归利用队列实现,注意的点主要是刚开始校验两个开始头结点是否为空和之后判断左右节点是否为空,总而言之,就是菜菜菜,菜的不行。
public boolean isSameTree(TreeNode p, TreeNode q) {
Queue<TreeNode> queue1 = new ArrayDeque<>();
Queue<TreeNode> queue2 = new ArrayDeque<>();
if(p==null||q==null){
if(p==null&&q==null){
return true;
}
return false;
}
queue1.add(p);
queue2.add(q);
while (!queue1.isEmpty()) {
if (queue2.isEmpty()) {
return false;
}
TreeNode node1 = queue1.remove();
TreeNode node2 = queue2.remove();
if (node1.val != node2.val) {
return false;
}
if (node1.left != null && node2.left!=null) {
queue1.add(node1.left);
queue2.add(node2.left);
}else{
if(node1.left==null&&node2.left==null){
}else{
return false;
}
}
if (node1.right != null && node2.right!=null) {
queue1.add(node1.right);
queue2.add(node2.right);
}else{
if(node1.right==null&&node2.right==null){
}else{
return false;
}
}
}
if(!queue2.isEmpty()){
return false;
}
return true;
}
结果看人家运行最快的,woc,3行递归实现,比我非递归还快,想死。
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null) return true;
if(p == null || q == null) return false;
return(p.val == q.val && (isSameTree(p.left, q.left) &&
isSameTree(p.right,q.right)));
}
最后把二叉树节点类给出
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}