方法一:递归
思路:
(1)若两棵树都为空,则返回true。
(2)若其中一棵树为空而另一棵树不为空,则返回false。
(3)否则判断根节点是否相等,以及左子树是否相同,右子树是否相同。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null)
return true;
else if (p != null && q == null || p == null && q != null)
return false;
return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
Runtime:0ms
方法二:栈操作
思路:
(1)先把两棵树的根节点依次放入栈。
(2)只要栈不为空,就弹出栈顶的两个节点,若两个节点都为空,则返回true;若一个节点为空而另一个节点不为空或两个节点的值不相等,则返回false。再把两棵树的左子节点和右子节点分别依次压入栈。
(3)栈为空时,返回true。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(p);
stack.push(q);
while (!stack.empty()) {
q = stack.pop();
p = stack.pop();
if (p == null && q == null)
continue;
else
if (p == null || q == null || p.val != q.val)
return false;
stack.push(p.left);
stack.push(q.left);
stack.push(p.right);
stack.push(q.right);
}
return true;
}
}
Runtime:1ms
方法三:队列操作
思路:
(1)先把两棵树的根节点依次放入队列。
(2)只要队列不为空,就弹出队列的头两个节点,若两个节点都为空,则返回true;若一个节点为空而另一个节点不为空或两个节点的值不相等,则返回false。再把两棵树的左子节点和右子节点分别依次压入队列。
(3)队列为空时,返回true。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(p);
queue.add(q);
while (!queue.isEmpty()) {
p = queue.poll();
q = queue.poll();
if (p == null && q ==null)
continue;
else
if (p == null || q == null || p.val != q.val)
return false;
queue.add(p.left);
queue.add(q.left);
queue.add(p.right);
queue.add(q.right);
}
return true;
}
}
Runtime:1ms