题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
有下面两种思路:
1. 递归
如果节点为空,则是对称的
如果左右子树都是空,则是对称的
如果左右子树值相同,则比较左子树的左子树和右子树的右子树,与上,左子树的右子树和右子树的左子树
2. 非递归
使用两个队列分别保存,左子树的节点和右子树的节点
左子树从左向右入队,右子树从右向左入队,依次比较
代码如下:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool compare_nodes_recursion(TreeNode* node1, TreeNode* node2){
if(NULL == node1 && NULL == node2){
return true;
}
if(NULL != node1 && NULL != node2 && node1->val == node2->val){
return compare_nodes_recursion(node1->left, node2->right) && compare_nodes_recursion(node1->right, node2->left);
}
return false;
}
bool compare_node_norecursion(TreeNode* node1, TreeNode* node2){
queue<TreeNode*> qleft;
queue<TreeNode*> qright;
qleft.push(node1);
qright.push(node2);
while(!qleft.empty() && !qright.empty()){
TreeNode* left = qleft.front();
TreeNode* right = qright.front();
qleft.pop();
qright.pop();
if(NULL == left && NULL == right){
continue;
}
if(NULL == left || NULL == right){
return false;
}
if(left->val != right->val){
return false;
}
qleft.push(left->left);
qleft.push(left->right);
qright.push(right->right);
qright.push(right->left);
}
return true;
}
bool isSymmetrical(TreeNode* pRoot)
{
if(NULL == pRoot){
return true;
}
//return compare_nodes_recursion(pRoot->left, pRoot->right);
return compare_node_norecursion(pRoot->left, pRoot->right);
}
};