1. 程式人生 > 其它 >力扣簡100 相同的樹

力扣簡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();

}