- Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
Example
For example, this binary tree {1,2,2,3,4,4,3} is symmetric:
1
/ \
2 2
/ \ / \
3 4 4 3
But the following {1,2,2,#,3,#,3} is not:
1
/ \
2 2
\ \
3 3
Notice
Bonus points if you could solve it both recursively and iteratively.
解法1:注意跟 LintCode 175. Invert Binary Tree区分。
经典的递归解法:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: root of the given tree
* @return: whether it is a mirror of itself
*/
bool isSymmetric(TreeNode * root) {
return helper(root, root);
}
bool helper(TreeNode * root1, TreeNode * root2) {
if (!root1 && !root2) return true;
if (!root1 || !root2) return false;
if (root1->val != root2->val) return false;
return helper(root1->left, root2->right) && helper(root1->right, root2->left);
}
};
解法2: Iteration。BST分层遍历的变形。
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: root of the given tree
* @return: whether it is a mirror of itself
*/
bool isSymmetric(TreeNode * root) {
if (!root) return true;
queue<TreeNode *> q;
q.push(root);
q.push(root);
while(!q.empty()) {
TreeNode *p1 = q.front();
q.pop();
TreeNode *p2 = q.front();
q.pop();
if (p1->val != p2->val) return false;
if (p1->left && p2->right) {
q.push(p1->left);
q.push(p2->right);
} else if (p1->left || p2->right)
return false;
if (p1->right && p2->left) {
q.push(p1->right);
q.push(p2->left);
} else if (p1->right || p2->left)
return false;
}
return true;
}
};
这里要注意第一个if block不能写成如下形式 :
if (!p1->left && !p2->right)
continue;
else if (p1->left && p2->right) {
q.push(p1->left);
q.push(p2->right);
} else
return false;
因为if(!p1->left && !p2->right)之后就不管三七二十一进入下轮迭代,但是实际上还要处理后面if (p1->right &&p2->left)的情况。而第2个if倒是可以写成如下形式:
if (!p1->right && !p2->left)
continue;
else if (p1->right && p2->left) {
q.push(p1->right);
q.push(p2->left);
} else
return false;
但是代码显得更长,而且好像也没有提高速度。