作者:Grey
原文地址:
題目描述見:LeetCode 100. Same Tree
即:如果兩個樹在結構上相同,並且節點具有相同的值,則認為它們是相同的。
比如:
兩個樹結構完全一致,對應位置上的值也一致,即為相同的樹,以下兩種情況都不是相同的樹:
思路也很簡單,首先,兩棵空樹是相同的樹,只有一棵樹是空樹,則一定不是相同的樹,即
if (p == null || q == null) {
// 兩個同時為空才表示 same tree
return q == null && p == null;
}
除此以外,兩棵樹的頭節點的值相等,才有可能是相同的樹
p.val == q.val
而且,還需要滿足,p 的左子樹和 q 的左子樹是相同的樹且 p 的右子樹和 q 的右子樹是相同的樹,這幾個條件同時滿足,才是相同的樹,以上條件整合一下,即:
return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
完整程式碼為
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null || q == null) {
// 兩個樹同時為空才表示 same tree
return q == null && p == null;
}
return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
題目描述見:LeetCode 101. Symmetric Tree
即:判斷一個樹是否軸對稱。
比如這個二元樹,就是軸對稱的:
以下這個二元樹,就不是軸對稱的,
本題的思路如下:
首先,空樹一定是鏡面二元樹
if (null == root) {
return true;
}
此外,左右子樹同時為空的時候,是鏡面二元樹
if (root.left == null || root.right == null) {
return root.left == null && root.right == null;
}
接下來定義遞迴函數
boolean isSymmetric(TreeNode left, TreeNode right)
遞迴含義是:判斷 left 和 right 這兩棵樹是否是鏡面對稱。
base case 是
if (left == null || right == null) {
// 兩棵樹同時為空才鏡面對稱
return left == null && right == null;
}
普遍情況,首先要滿足,left 樹頭節點的值和 right 樹頭節點的值一樣,然後是 left 的左子樹和 right 的右子樹鏡面對稱,且 left 樹的右子樹和 right 樹的左子樹鏡面對稱,三個條件同時滿足,left 和 right 才鏡面對稱
public boolean isSymmetric(TreeNode left, TreeNode right) {
if (left == null || right == null) {
return left == null && right == null;
}
// left.val == right.val
return left.val == right.val && isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
}
主函數直接呼叫這個遞迴方法:
public boolean isSymmetric(TreeNode root) {
if (null == root) {
return true;
}
if (root.left == null || root.right == null) {
return root.left == null && root.right == null;
}
return root.left.val == root.right.val && isSymmetric(root.left, root.right);
}
本文來自部落格園,作者:Grey Zeng,轉載請註明原文連結:https://www.cnblogs.com/greyzeng/p/16971977.html