题目描述:
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
示例 2:
示例 3:
解题方法一:深度优先遍历,递归
-
终止条件与返回值:
-
当两棵树的当前节点都为 null 时,返回 true
-
当其中一个为 null ,另一个不为 null 时,返回 false
-
当两个都不为空但是值不相等时,返回 false
-
-
执行过程:当满足终止条件时进行返回,不满足时分别判断左子树和右子树是否相同,其中要注意代码中的短路效应
-
时间复杂度:O(n),n 为树的节点个数
/**
* 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;
}
// 两个都非空,但 val 不一样也不行
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) {
if (p == null && q == null) {
return true;
} else if (p == null || q == null) {
return false;
}
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(p);
queue.add(q);
while(!queue.isEmpty()) {
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if (left == null && right == null) {
// 都是空的,遍历到叶子节点了
continue;
} else if (left == null || right == null) {
// 有一个为null
return false;
} else if (left.val != right.val) {
// 不相等.
return false;
}
// 左子树入队
queue.add(left.left);
queue.add(right.left);
// 右子树入队
queue.add(left.right);
queue.add(right.right);
}
return true;
}
}
其实我们本质上就是要比较左右两棵树,也没必要非要是队列,其实stack也是可以的,大同小异。所以并不是你记住哪种数据结构,关键是你能理解后,灵活应用。
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
} else if (p == null || q == null) {
return false;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(p);
stack.push(q);
while(!stack.isEmpty()) {
TreeNode left = stack.pop();
TreeNode right = stack.pop();
if (left == null && right == null) {
continue;
} else if (left == null || right == null) {
return false;
} else if (left.val != right.val) {
return false;
}
stack.push(left.left);
stack.push(right.left);
stack.push(left.right);
stack.push(right.right);
}
return true;
}
}