判斷是否爲對稱二叉樹;
知識點:
樹的增刪改查基本操作;
解題思路
解法一:遞歸
如果一個樹的左子樹與右子樹鏡像對稱,那麼這個樹是對稱的。
如果同時滿足下面的條件,兩個樹互爲鏡像:
1、它們的兩個根結點具有相同的值。
2、每個樹的右子樹都與另一個樹的左子樹鏡像對稱:左子樹的左節點和右子樹的右節點相等;左子樹的右節點與右子樹的左節點相等;
class Solution {
public:
bool isSymmetric(TreeNode* root) { // 指向樹根節點的形參結構體類型指針
// use the method of digui
//the first thing to consider is how to end
return isSymmetric2(root,root); // 調用自己的私有方法
}
private:
bool isSymmetric2(TreeNode* pl,TreeNode* pr){ // 還是得需要兩個左右子樹
if(pl==NULL&&pr==NULL){
return true;
}
if(pl==NULL||pr==NULL){
return false;
}
if(pl->val==pr->val){
return (isSymmetric2(pl->left,pr->right))&&(isSymmetric2(pl->right,pr->left));
}
return false ;// 只是爲了給出返回值而已
}
};
解法二: 迭代法
迭代方法:利用隊列進行迭代:隊列中每兩個連續的結點應該是相等的,而且它們的子樹互爲鏡像。最初,隊列中包含的是 root 以及 root。該算法的工作原理類似於 BFS,但存在一些關鍵差異。每次提取兩個結點並比較它們的值。然後,將兩個結點的左右子結點按相反的順序插入隊列中。當隊列爲空時,或者我們檢測到樹不對稱(即從隊列中取出兩個不相等的連續結點)時,該算法結束;
public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
q.add(root);
while (!q.isEmpty()) {
TreeNode t1 = q.poll();
TreeNode t2 = q.poll();
if (t1 == null && t2 == null) continue;
if (t1 == null || t2 == null) return false;
if (t1.val != t2.val) return false;
q.add(t1.left);
q.add(t2.right);
q.add(t1.right);
q.add(t2.left);
}
return true;
}
小結
現在能做到的事情,就現在做,絕不拖累子孫後代;