101. 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
/**
* 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) {
bool res = true;
if(!root)
return res;
res = dfs(root->left,root->right);
return res;
}
bool dfs(TreeNode* left,TreeNode* right){
if(!left && !right) return true;
if(!left || !right) return false;
if(left->val != right->val) return false;
return dfs(left->left,right->right) && dfs(left->right,right->left);
}
};
解答:如果要判断这棵树是否对称,那么他的子树肯定也是对称的,所以要用到递归。我们要判断的并不是一个节点的左右子节点是否是相同的而是这棵树是否是对称的。所以要把递归的形参改为对称的节点。这个对称节点的左子节点应该与另一个对称节点的右子节点对称,这个对称节点的右子节点应该与另一个对称节点的左子节点对称。那么返回值就可以确定了。又节点存在为空的情况,如果两个需要判断的节点同时为空可以判为true,如果一个为空一个不为空,则为false,如果都不为空则判断val是否相等。
/**
* 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) {
return check(root);
}
bool check(TreeNode* root){
queue<TreeNode*> q;
q.push(root);
q.push(root);
while(!q.empty()){
TreeNode* left = q.front();
q.pop();
TreeNode* right = q.front();
q.pop();
if(!left && !right) continue;
if(!left || !right) return false;
if(left->val != right->val) return false;
q.push(left->left);
q.push(right->right);
q.push(left->right);
q.push(right->left);
}
return true;
}
};
解答:在递归的基础上写出迭代写法,由于根节点有且只有一个所以他可以认为和自己对称,然后还是上面的方法,但是需要注意的是,需要比较的是从队列出来的连续两个元素。