尽管写LeetCode解答主要是为了自己整理思路,但是如果对您也正好有帮助,请点个赞给菜鸟一点鼓励吧 :-)
原题
解法概览
解法1使用了递归;
解法2使用了迭代法。
解法1
解法分析
递归判断两棵树的左子树是否相同,如果两棵子树都相同并且根节点的值也相同的话,则两棵树相同。
代码
public class Solution100_Recursive {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null)
return true;
else if ((p == null && qa != null) || (p != null && q == null))
return false;
boolean leftChildEqual = isSameTree(p.left, q.left);
boolean rightChildEqual = isSameTree(p.right, q.right);
if (leftChildEqual && rightChildEqual){
return p.val == q.val;
}else
return false;
}
}
解法2
解法分析
将树P与树Q节点依次push进DequeP与DequeQ,通过判断每一次push时队列的变化,可以判断出不同节点之间的位置关系;通过pop之后判断值,可以判断节点之间的值是否相同。
图解
代码
public class Solution100_iterator {
public boolean isSameTree(TreeNode p, TreeNode q) {
Deque<TreeNode> pDeque = new LinkedList<TreeNode>(), qDeque = new LinkedList<TreeNode>();
if (p!= null)
pDeque.push(p);
if (q != null)
qDeque.push(q);
while (!pDeque.isEmpty() && !qDeque.isEmpty()){
int pSize = pDeque.size(), qSize = qDeque.size();
while (pSize-- > 0 && qSize -- >0){
TreeNode pNode = pDeque.pop(), qNode = qDeque.pop();
if (pNode.val != qNode.val)
return false;
if (pNode.left != null)
pDeque.addLast(pNode.left);
if (qNode.left != null)
qDeque.addLast(qNode.left);
if (pDeque.size() != qDeque.size())
return false ;
if (pNode.right != null)
pDeque.addLast(pNode.right);
if (qNode.right != null)
qDeque.addLast(qNode.right);
}
}
return pDeque.size() == qDeque.size();
}
}