1. 程式人生 > >LeetCode刷題Easy篇兩個二叉樹是否相同

LeetCode刷題Easy篇兩個二叉樹是否相同

題目

Given two binary trees, write a function to check if they are the same or not.

Two binary trees are considered the same if they are structurally identical and the nodes have the same value.

Example 1:

Input:     1         1
          / \       / \
         2   3     2   3

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

Output: true

Example 2:

Input:     1         1
          /           \
         2             2

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

Output: false

Example 3:

Input:     1         1
          / \       / \
         2   1     1   2

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

Output: false

我的嘗試

分析一下,相同的要素:第一結構相同,第二節點數值相同。是否可以考慮遍歷之後,比較結果是否相同?

看到有人用遞迴,很顯然可以用遞迴解決,先寫一下遞迴的方法:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p==null||q==null) return false;
        if(p.left!=null&&q.left!=null){
            isSameTree(p.left,q.left);
        }
        if(p.right!=null&&q.right!=null){
             isSameTree(p.right,q.right);
        }
        return p.val==q.val;
        
    }
}

第一版本我出現了錯誤,1-2 和1-null-2無法處理。整理一下思路,因為是遞迴,我們看單個節點如何判斷相等是否,分幾個情況:

第一:如果p和q都存在這個節點,並且值相同,則true

第二:如果p和q只有一個存在這個節點,返回false;

第三:如果pq都存在,值不同,false

第四:都不存在,true

遞迴呼叫左邊和右邊,修改後程式碼如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        //到達葉子節點後,同時為空,意味相同
        if(p==null&&q==null) return true;
        if(p==null||q==null) return false;
        if(p.val!=q.val) return false;
        return isSameTree(p.left,q.left) &&isSameTree(p.right,q.right);       
        
    }
}

非遞迴解法

本來只是寫了遞迴寫法,當時對於二叉樹沒有解題思路,後面寫了二叉樹是否相同後,總結出二叉樹非遞迴的解題思路,所以重新回來,嘗試寫一些非遞迴思路,完美解決:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        Queue<TreeNode> queue=new LinkedList();
        queue.add(p);
        queue.add(q);
        while(!queue.isEmpty()){
            TreeNode node1=queue.poll();
            TreeNode node2=queue.poll();
            //開始寫成了return,直接返回,應該繼續
            if(node1==null&&node2==null) continue;
            if(node1==null||node2==null) return false;
            if(node1.val!=node2.val) return false;
            queue.add(node1.left);
            queue.add(node2.left);
            queue.add(node1.right);
            queue.add(node2.right);  
        }
        return true;      
        
    }
}