動手刷LeetCode-對稱二叉樹


判斷是否爲對稱二叉樹;

知識點:

樹的增刪改查基本操作;

解題思路

解法一:遞歸
如果一個樹的左子樹與右子樹鏡像對稱,那麼這個樹是對稱的。
如果同時滿足下面的條件,兩個樹互爲鏡像:
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;
}

小結

現在能做到的事情,就現在做,絕不拖累子孫後代;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章