#100. 相同的树
难度:简单
题目描述
解题思路
其实考察的就是二叉树的遍历,遍历一次如果全部相同就返回true,否则就返回false
1、递归解法
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null)
return true;
if(p != null && q != null && p.val == q.val) {
return isSameTree(p.left, q.left) && isSameTree(p.right,q.right);
}
else {
return false;
}
}
提交结果:
2、前序遍历判断
根左右,先入栈右孩子,再入栈左孩子
public boolean isSameTree1(TreeNode p, TreeNode q) {
if(p == null && q == null)
return true;
if(p == null) return false;
if(q == null) return false;
Stack<TreeNode> stackp = new Stack<>();
Stack<TreeNode> stackq = new Stack<>();
stackp.add(p);
stackq.add(q);
while(!stackp.isEmpty() || !stackq.isEmpty()) {
TreeNode pp = stackp.pop();
TreeNode qq = stackq.pop();
if(pp == null && qq == null)
continue;
if(pp == null) return false;
if(qq == null) return false;
if(pp.val != qq.val) return false;
else {//注意栈是后进先出,所以先入栈右子树,再入栈左子树
stackp.add(pp.right);
stackq.add(qq.right);
stackp.add(pp.left);
stackq.add(qq.left);
}
}
return true;
}
提交结果:
3、中序遍历比较
左根右
public boolean isSameTree2(TreeNode p, TreeNode q) {
if(p == null && q == null)
return true;
if(p == null) return false;
if(q == null) return false;
Stack<TreeNode> stackp = new Stack<>();
Stack<TreeNode> stackq = new Stack<>();
while(p != null || q != null || !stackp.isEmpty() || !stackq.isEmpty()) {
if(p!= null && q != null) { //不为空那左子树入栈
stackp.add(p);
stackq.add(q);
p = p.left;
q = q.left;
}
else if(p == null && q == null) { //如果到一端的叶子节点,访问然后入栈右子树
p = stackp.pop();
q = stackq.pop();
if(p.val != q.val) return false;
p = p.right;
q = q.right;
}
else {
return false;
}
}
return true;
}
提交结果: