相同二元樹和鏡面二元樹問題

2023-12-20 06:00:30

相同二元樹和鏡面二元樹問題

作者:Grey

原文地址:

部落格園:相同二元樹和鏡面二元樹問題

CSDN:相同二元樹和鏡面二元樹問題

判斷兩棵樹是否是相同的樹

題目描述見: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);
}

更多

演演算法和資料結構學習筆記

演演算法和資料結構學習程式碼

參考資料

演演算法和資料結構體系班-左程雲