对于给定的二叉树判断是不是对称的一般有两种方法:递归判断和非递归判断,递归判断的话比较直接,非递归判断能帮助我们更好的理解整一个对称二叉树
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
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,null,3,null,3] is not:
1
/ \
2 2
\ \
3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
使用非递归判断的时间复杂度为:O(N),假设O为二叉树的节点的数目。
/**
* 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 Mirror(root -> left, root -> right);
}
private:
bool Mirror(TreeNode* node1, TreeNode* node2) {
if (node1 == NULL && node2 == NULL)
return true;
else if (node1 == NULL && node2 != NULL)
return false;
else if (node1 != NULL && node2 == NULL)
return false;
else if (node1 -> val != node2 -> val)
return false;
else
return Mirror(node1 -> left, node2 ->right)
&& Mirror(node1 -> right, node2 -> left);
}
};
//非递归实现
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (root == NULL) {
return true;
}
else {
deque<TreeNode*> dque;
TreeNode* nleft;
TreeNode* nright;
if (root -> left != NULL &&
root -> right == NULL)
return false;
else if (root -> left == NULL &&
root -> right != NULL)
return false;
else if (root -> left == NULL &&
root -> right == NULL)
return true;
else {
dque.push_front(root -> left);
dque.push_back(root -> right);
while (!dque.empty()) {
nleft = dque.front();
nright = dque.back();
dque.pop_front();
dque.pop_back();
if (nleft -> val != nright -> val)
return false;
else if (nleft -> left != NULL &&
nright -> right == NULL)
return false;
else if (nleft -> left == NULL &&
nright -> right != NULL)
return false;
else if (nleft -> right == NULL &&
nright -> left != NULL)
return false;
else if (nleft -> right != NULL &&
nright -> left == NULL)
return false;
if (nleft -> left != NULL &&
nright -> right != NULL) {
dque.push_front(nleft -> left);
dque.push_back(nright ->right);
}
if (nleft -> right != NULL &&
nright -> left != NULL) {
dque.push_front(nleft ->right);
dque.push_back(nright -> left);
}
}
}
return true;
}
}
};