力扣简100 相同的树
递归中的return
自己写的方案中,最初出错。
加断点调试发现若左子树不同右子树相同或者中间节点不同其他后继节点相同的情况下,
true把return的false覆盖掉,进而出错。
自己本来觉得只要有了return后面的就都不执行了,但是这只针对普通情况。
在递归中只会结束本次执行,后面还会执行,且以最后的return为结果。
最初这句return是单单的两个isSameTree调用,会导致出错。看了题解后知道直接在这块return的解决方案

package leetcode01; class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } } //给你两棵二叉树的根节点 p和 q,编写一个函数来检验这两棵树是否相同。 //如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 public class Solution100 { public static boolean isSameTree(TreeNode p,TreeNode q) { if(p!=null&&q!=null&&p.val==q.val) { return(isSameTree(p.left, q.left)&&isSameTree(p.right, q.right)); /*最初这句return是单单的两个isSameTree调用,会导致若左子树不同右子树相同或者中间节点不同, * 其他后继节点相同的情况下,true把更改的false覆盖掉,进而出错。看了题解后知道直接在这块return的解决方案*/ } else if((p!=null&&q==null)||(p==null&&q!=null)||(p!=null&&q!=null&&p.val!=q.val)) { return false; } return true; } public static void main(String[] args) { // TODO Auto-generated method stub // TreeNode p=new TreeNode(1,new TreeNode(2,new TreeNode(5),new TreeNode(5)),new TreeNode()); // TreeNode q=new TreeNode(1,new TreeNode(2,new TreeNode(4),new TreeNode(5)),new TreeNode()); TreeNode p=new TreeNode(1,new TreeNode(2,null,null),new TreeNode(2,null,null)); TreeNode q=new TreeNode(1,new TreeNode(3,null,null),new TreeNode(2,null,null)); System.out.print(isSameTree(p, q)); } }
题解1:深度优先遍历
//深度优先检索 public static boolean isSameTree(TreeNode p,TreeNode q) { if(p==null&&q==null) { return true; } else if(p==null||q==null) { return false; } else if(p.val!=q.val) { return false; } else { return(isSameTree(p.left, q.left)&&isSameTree(p.right, q.right)); } }
题解2:广度优先 用队列
public static boolean isSameTree(TreeNode p,TreeNode q) { if(p == null && q == null){ return true; } else if(p == null || q == null) { return false; } // else if(p.val!=q.val) { // return false; // } //这三句直接可以注释掉 因为下面会判断的 Queue<TreeNode> queue1 = new LinkedList<TreeNode>(); Queue<TreeNode> queue2 = new LinkedList<TreeNode>(); queue1.add(p);//人家用的是queue1.offer queue2.add(q); while(!queue1.isEmpty() && !queue2.isEmpty()) {//(queue1!=null&&queue2!=null)队列不可以这么判空 TreeNode node1=queue1.poll(); TreeNode node2=queue2.poll(); if(node1.val != node2.val) {//这一句必须加,因为虽然根节点相同,但是插入的左右节点可不一定。 return false; } if(node1.left == null ^ node2.left == null) { return false;//异或是不同为1 } if(node1.right == null ^ node2.right == null) { return false; } if(node1.left != null) { queue1.add(node1.left); } if(node2.left != null) { queue2.add(node2.left); } if(node1.right != null) { queue1.add(node1.right); } if(node2.right != null) { queue2.add(node2.right); } }
return queue1.isEmpty()&&queue2.isEmpty();
}

浙公网安备 33010602011771号