/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
//dfs方法1,遞歸時先左邊後右邊
void dfs1(TreeNode *node,vector<char> &charVec)
{
if(node==NULL)
{
charVec.push_back('#');
return ;
}
charVec.push_back('0'+node->val);
dfs1(node->left,charVec);
dfs1(node->right,charVec);
}
//dfs方法2,遞歸時先右邊後左邊
void dfs2(TreeNode *node,vector<char> &charVec)
{
if(node==NULL)
{
charVec.push_back('#');
return ;
}
charVec.push_back('0'+node->val);
dfs2(node->right,charVec);
dfs2(node->left,charVec);
}
bool isSymmetric(TreeNode *root) {
vector<char> charVec1,charVec2;
if(root==NULL)
return true;
if(root->left!=NULL)
dfs1(root->left,charVec1);//對左子樹進行dfs1
if(root->right!=NULL)
dfs2(root->right,charVec2);//對右子樹進行dfs2
//判斷對根節點的左右子樹得到的兩組遍歷序列是否相同,相同則說明是對稱樹
if(charVec1.size()!=charVec2.size())
return false;
for(vector<char>::iterator iter1=charVec1.begin(),iter2=charVec2.begin(); iter1!=charVec1.end(); iter1++,iter2++)
{
if(*iter1!=*iter2)
return false;
}
return true;
}
};
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
題目簡單,主要是要想到方法:
對根節點的左子樹進行dfs(遞歸時先左後右),對根節點的右子樹進行dfs(遞歸時先右後左),最後判斷得到的兩組序列是否相同即可。
注意比如對於上圖中兩個例子:
第一個得到的是:左邊"123##4##"和右邊"123##4##",所以對稱。
第二個得到的是:左邊"12#3##"和右邊"123###",所以不對稱。