1. 程式人生 > >LeetCode之二叉樹判斷是否相同(簡單 二叉樹)

LeetCode之二叉樹判斷是否相同(簡單 二叉樹)

問題描述:

給定兩個二叉樹,編寫一個函式來檢驗它們是否相同。

如果兩個樹在結構上相同,並且節點具有相同的值,則認為它們是相同的。

示例 1:

輸入:       1         1
          / \       / \
         2   3     2   3

        [1,2,3],   [1,2,3]

輸出: true

示例 2:

輸入:      1          1
          /           \
         2             2

        [1,2],     [1,null,2]

輸出:
false

示例 3:

輸入:       1         1
          / \       / \
         2   1     1   2

        [1,2,1],   [1,1,2]

輸出: false

tmd,寫了40分鐘,寫出了一個非遞迴利用佇列實現,注意的點主要是剛開始校驗兩個開始頭結點是否為空和之後判斷左右節點是否為空,總而言之,就是菜菜菜,菜的不行。

public boolean isSameTree(TreeNode p, TreeNode q) {
        Queue<TreeNode> queue1 = new ArrayDeque<>();
        Queue<TreeNode> queue2 = new ArrayDeque<>();
        if(p==null||q==null){
            if(p==null&&q==null){
                return true;
            }
            return false;
        }
            queue1.add(p);
            queue2.add(q);
            while (!queue1.isEmpty()) {
                if (queue2.isEmpty()) {
                    return false;
                }
                TreeNode node1 = queue1.remove();
                TreeNode node2 = queue2.remove();
                if (node1.val != node2.val) {
                    return false;
                }
                if (node1.left != null && node2.left!=null) {
                        queue1.add(node1.left);
                        queue2.add(node2.left);
                    }else{
                    if(node1.left==null&&node2.left==null){
                    }else{
                        return false;
                    }
                }
                if (node1.right != null && node2.right!=null) {
                    queue1.add(node1.right);
                    queue2.add(node2.right);
                }else{
                    if(node1.right==null&&node2.right==null){
                    }else{
                        return false;
                    }
                }
                }
        if(!queue2.isEmpty()){
            return false;
        }
        return true;
    }

結果看人家執行最快的,woc,3行遞迴實現,比我非遞迴還快,想死。

 public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q == null) return true;
        if(p == null || q == null) return false;
        return(p.val == q.val && (isSameTree(p.left, q.left) && 
               isSameTree(p.right,q.right)));
    }

最後把二叉樹節點類給出

class TreeNode {
     int val;
     TreeNode left;
     TreeNode right;
     TreeNode(int x) { val = x; }
 }