解题思路
- 本题判断二叉树是否对称,要通过对二叉树的层序遍历来实现,即通过层序遍历来判断当前状态是否满足对称,并进入下一层判断,是较为典型的BFS。
- 根据题目备注所提示的,这里给出递归以及迭代两种解法。
- 题目相对要注意的地方在于,是在于对节点的访问顺序,即如何满足对称的条件,示意图如下:
方法一:递归
class Solution {
public:
/**
*
* @param root TreeNode类
* @return bool布尔型
*/
bool isSymmetric(TreeNode* root) {
// write code here
if(root==nullptr)
return true;
return help(root->left,root->right);
}
//辅助递归函数,参数为两节点,判断两节点是否当前值相等且子节点满足对称。
bool help(TreeNode* left,TreeNode* right){
//判断left和right有可能为空指针的情况
if(!left&&!right)
return true;
//其中有一个节点不存在,或者两节点值不等,则返回false
if((!left||!right)||(left->val!=right->val))
return false;
//递归调用判断
return help(left->left,right->right)&&help(left->right,right->left);
}
};复杂度分析:
时间复杂度:O(n),n为节点数量,每个节点访问一次。
空间复杂度:O(n),来源于递归使用的栈空间,递归次数是n的级别。
方法二:迭代
class Solution {
public:
/**
*
* @param root TreeNode类
* @return bool布尔型
*/
bool isSymmetric(TreeNode* root) {
// write code here
if(root==nullptr)
return true;
//队列q按序存储每次需要判断的两节点。left,right相邻
queue<TreeNode*> q;
q.push(root->left);
q.push(root->right);
while(!q.empty()){
TreeNode* l=q.front();
q.pop();
TreeNode* r=q.front();
q.pop();
//与方法一中的判断方式相同
if(!l&&!r)
continue;
if((!l||!r)||(l->val!=r->val))
return false;
//按照满足对称要求的方式进行两两组合,保证下次pop出来的l,r是需要判断的一对节点。
q.push(l->left);
q.push(r->right);
q.push(l->right);
q.push(r->left);
}
return true;
}
};复杂度分析:
时间复杂度:O(n),同上。
空间复杂度:O(n),来源于队列中的节点数量,不超过n。



京公网安备 11010502036488号