题目
Given two binary trees, write a function to check if they are the same or not.
Two binary trees are considered the same if they are structurally identical and the nodes have the same value.
Example 1:
Input: 1 1
/ \ / \
2 3 2 3
[1,2,3], [1,2,3]
Output: true
Example 2:
Input: 1 1
/ \
2 2
[1,2], [1,null,2]
Output: false
Example 3:
Input: 1 1
/ \ / \
2 1 1 2
[1,2,1], [1,1,2]
Output: false
我的尝试
分析一下,相同的要素:第一结构相同,第二节点数值相同。是否可以考虑遍历之后,比较结果是否相同?
看到有人用递归,很显然可以用递归解决,先写一下递归的方法:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p==null||q==null) return false;
if(p.left!=null&&q.left!=null){
isSameTree(p.left,q.left);
}
if(p.right!=null&&q.right!=null){
isSameTree(p.right,q.right);
}
return p.val==q.val;
}
}
第一版本我出现了错误,1-2 和1-null-2无法处理。整理一下思路,因为是递归,我们看单个节点如何判断相等是否,分几个情况:
第一:如果p和q都存在这个节点,并且值相同,则true
第二:如果p和q只有一个存在这个节点,返回false;
第三:如果pq都存在,值不同,false
第四:都不存在,true
递归调用左边和右边,修改后代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSameTree(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 isSameTree(p.left,q.left) &&isSameTree(p.right,q.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 isSameTree(TreeNode p, TreeNode q) {
Queue<TreeNode> queue=new LinkedList();
queue.add(p);
queue.add(q);
while(!queue.isEmpty()){
TreeNode node1=queue.poll();
TreeNode node2=queue.poll();
//开始写成了return,直接返回,应该继续
if(node1==null&&node2==null) continue;
if(node1==null||node2==null) return false;
if(node1.val!=node2.val) return false;
queue.add(node1.left);
queue.add(node2.left);
queue.add(node1.right);
queue.add(node2.right);
}
return true;
}
}