一、 題目
給一個二叉樹,判斷這個樹是不是鏡像的(對稱的)。
例子: 1
/ \
2 2
/ \ / \
3 4 4 3
但是這個就不是: 1
/ \
2 2
\ \
3 3
二、 分析
1、遞歸
從根開始,迭代查看左子樹和右子樹是否是對稱的。
其中左子樹和右子樹對稱的條件(均非空條件下)是:
1>兩個節點值相等
2>左節點的左子樹和右節點的右子樹對稱
3>左節點的右子樹和右節點的左子樹對稱
2、非遞歸
使用非遞歸時,我們可以創建兩個隊列,將根節點的左右子樹分別入隊,入隊的同時比較,發現對稱位置的節點值不等,則返回false;
1> 根節點的左右子樹入隊
2> 隊列出隊
3> 如果值相等,則4,否則返回false
4> 將當前左節點左子樹和當前右節點的右子樹入隊,如果其中只要有一個為空,則返回false
5> 將當前右節點左子樹和當前左節點的右子樹入隊,如果其中只要有一個為空,則返回false
6> 最後,判斷兩個隊列是否同時為空,是,則返回true,否則返回false
遞歸:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool isSymmetric(TreeNode *Lroot,TreeNode *Rroot) { if(Lroot==NULL) return Rroot==NULL; else { if(Rroot==NULL) return false; if(Lroot->val!=Rroot->val) return false; if(!isSymmetric(Lroot->right,Rroot->left)) return false; if(!isSymmetric(Lroot->left,Rroot->right)) return false; return true; } } bool isSymmetric(TreeNode *root) { if(root==NULL) return true; TreeNode *Rroot; TreeNode *Lroot; Rroot = root->right; Lroot = root->left; return isSymmetric(Lroot,Rroot); } };
/** * Definition for binary tree * 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) return true; return compare(root->left, root->right); } bool compare(TreeNode *Lroot, TreeNode *Rroot) { if (Lroot!=NULL && Rroot!=NULL) return true; if (Lroot!=NULL && Rroot==NULL || Lroot==NULL && Rroot!=NULL) return false; if (Lroot->val != Rroot->val) return false; return compare(Lroot->left, Rroot->right) && compare(Lroot->right, Rroot->left); } };
/** * Definition for binary tree * 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 Lque; queue Rque; if(root->left) Lque.push(root->left); if(root->right) Rque.push(root->right); while(!Lque.empty()&&!Rque.empty()){ TreeNode *ql = Lque.front(); TreeNode *qr = Rque.front(); Lque.pop(); Rque.pop(); if(ql->val == qr->val){ if(ql->left&&qr->right){ Lque.push(ql->left); Rque.push(qr->right); } else if(ql->left||qr->right) return false; if(qr->left&&ql->right){ Lque.push(qr->left); Rque.push(ql->right); } else if(qr->left||ql->right) return false; } else return false; } if(Lque.empty() && Rque.empty()) return true; else return false; } };