NC16 判断二叉树是否对称
情景提要
牛客题解系列,按照题号顺序开始。
01
题目描述
02
输入输出示例
输入:
{1,2,2}
输出:
true
03
题目分析
二叉树的问题,还是两种方法,递归或者迭代。
递归就是要想好判断条件和要比较的两个结点。只要有一个左右两个结点不一样的时候返回false。要比较的两个结点应该是左边的树的左节点和右边的树的右节点,左边树的右节点和右边树的左节点。有一个是false就返回false,所以是&&的关系。
迭代的方法用队列或者栈都可以,依次弹出两个结点进行比较就可以。需要注意的是放入的顺序。可以通过自己画树模拟来搞清楚该按照什么顺序放入。
03
代码实现
方法1
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return bool布尔型
*/
// 方法1:递归
bool isSymmetric(TreeNode* root) {
// write code here
if(!root) return true;
return travel(root->left,root->right);
}
bool travel(TreeNode* l,TreeNode* r){
if(!l && !r) return true;
else if(!l || !r) return false;
else if(l->val != r->val) return false;
else return travel(l->left,r->right) && travel(l->right,r->left);
}
};
方法2
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return bool布尔型
*/
// 方法2:迭代 队列模拟,两两一组
bool isSymmetric(TreeNode* root) {
// write code here
if(!root) return true;
queue<TreeNode*> q;
q.push(root->left);
q.push(root->right);
TreeNode* l,*r;
while(!q.empty()){
l = q.front();
q.pop();
r=q.front();
q.pop();
if(!l && !r) continue;
else if(!l || !r) return false;
else if(l->val != r->val) return false;
else {
q.push(l->left);
q.push(r->right);
q.push(l->right);
q.push(r->left);
}
}
return true;
}
};
04
总结
二叉树的迭代和递归两种方法。对称问题需要注意的是应该比较哪两个结点,就决定了递归方法的函数传入参数和迭代方法的数据结构的结点放入的顺序。