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-/