101 對稱二叉樹(BFS/DFS C++ )

101 對稱二叉樹

給定一個二叉樹,檢查它是否是鏡像對稱的。

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。

	1
   / \
  2   2
 / \ / \
3  4 4  3

思路 - 遞歸(DFS)

需要兩個指針來鏡像比較。

一個指針root1在左子樹,另一個指針root2在右子樹;
比較root1->left == root2->right 和 root1->right == root2->left,也就是鏡像比較。

時間複雜度:O(n)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root==NULL) return true;  //根節點爲空,對
        else return dfs(root->left, root->right);  //否則去遞歸
    }
private:
    bool dfs(TreeNode* root1, TreeNode* root2){
        if(root1==NULL&&root2==NULL) return true;//左右子樹都爲空,對
        else if(root1==NULL||root2==NULL) return false;//左右子樹一邊爲空,錯
        else if(root1->val!=root2->val) return false;//左右子樹的值不相等,錯
        else return(dfs(root1->left,root2->right)&&dfs(root1->right,root2->left));//相等則繼續遞歸,比較左子樹的左子樹和右子樹的右子樹以及對應的相反面
    }
};

思路 - BFS

如果是滿二叉樹,只需要判斷每一層的數據是否迴文。但現在不是滿二叉樹,需要對空節點的值用其他值代替。

  • 如果一個節點不爲空,就將它的左右節點都添加到隊列中

  • 如果當前節點爲空,則其值用INT_MIN來代替,不添加左右節點

  • 每層判斷是否迴文

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root==NULL) return true;
        queue <TreeNode*> q;
        q.push(root);
        
        while(!q.empty()){
            int size=q.size();
            vector<int> temp(size);//需要下標時,必須初始化數組的大小
            for(int i=0;i<size;i++){
                auto node = q.front();
                q.pop();
                //temp.push_back(node->val);
                temp[i] = node ? node->val : INT_MIN;
                if(node){
                    q.push(node->left);
                    q.push(node->right);
                }
                //if(node->left) q.push(node->left);
                //if(node->right) q.push(node->right);
            }
            for(int i=0;i<size/2;i++){
                if(temp[i]!=temp[size-1-i]) return false;
            }
        
        }
        return true;
    }
};

鏈接:https://leetcode-cn.com/problems/symmetric-tree/solution/c-bfshe-dfsjie-jue-dui-cheng-er-cha-shu-wen-ti-by-/

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