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
Note:
Bonus points if you could solve it both recursively and iteratively.
算法1:递归解法,判断左右两颗子树是否对称,只要两颗子树的根节点值相同,并且左边子树的左子树和右边子树饿右子树对称 且 左边子树的右子树和右边子树的左子树对称
/**
* 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) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(root == NULL)return true;
return isSymmetricRecur(root->left, root->right);
}
bool isSymmetricRecur(TreeNode *root1, TreeNode *root2)
{
if(root1 != NULL && root2 != NULL)
{
if(root1->val == root2->val &&
isSymmetricRecur(root1->left, root2->right) &&
isSymmetricRecur(root1->right, root2->left))
return true;
else return false;
}
else if(root1 != NULL || root2 != NULL)
return false;
else return true;
}
};
算法2:非递归解法,用两个队列分别保存左子树节点和右子树节点,每次从两个队列中分别取出元素,如果两个元素的值相等,则继续把他们的左右节点加入左右队列。要注意每次取出的两个元素,左队列元素的左孩子要和右队列元素的右孩子要同时不为空或者同时为空,否则不可能对称,同理左队列元素的右孩子要和右队列元素的左孩子也一样。
/**
* 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) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(root == NULL)return true;
queue<TreeNode*> qleft, qright;
if(root->left)qleft.push(root->left);
if(root->right)qright.push(root->right);
while(qleft.empty() == false && qright.empty() == false)
{
TreeNode *ql = qleft.front();
TreeNode *qr = qright.front();
qleft.pop(); qright.pop();
if(ql->val == qr->val)
{
if(ql->left && qr->right)
{
qleft.push(ql->left);
qright.push(qr->right);
}
else if(ql->left || qr->right)
return false;
if(qr->left && ql->right)
{
qleft.push(qr->left);
qright.push(ql->right);
}
else if(qr->left || ql->right)
return false;
}
else return false;
}
if(qleft.empty() && qright.empty())
return true;
else return false;
}
};