LeetCode刷題Easy篇兩個二叉樹是否相同
阿新 • • 發佈:2018-12-05
題目
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;
}
}