leetcode 剑指 Offer 28. 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/
2 2
/ \ /
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/
2 2
\
3 3
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
递归
1.递归的参数和返回值:左孩子和右孩子,返回值为bool
2.递归的单层逻辑:左节点的左孩子和右节点的右孩子以及左节点的右孩子和右节点的左孩子;左右对称则返回true,不对称则返回false;
3.递归的终止条件:左右孩子都为空,true;
左右孩子只有一个为空,false;
左右孩子都不为空,但节点值不等,false;
bool compare(TreeNode* left, TreeNode* right){
if(left == nullptr && right == nullptr) return true;
else if(left == nullptr || right == nullptr) return false;
else if(left->val != right->val) return false;
else return compare(left->left, right->right) && compare(left->right, right->left);
}
bool isSymmetric(TreeNode* root) {
if (root == nullptr) return true;
return compare(root->left, root->right);
}
迭代
利用一个队列,将当前节点的左右子树入队列,判断它们是否对称,(都为空或者节点值相等),不对称则退出,对称则将其当前的左右子树的对称位置结点以依次入队列,队列每次出两个节点判断是否对称,一直到队列为空退出
//始终明确一点,不论是迭代还是递归,每次我们都是左右对称的位置同时比较
bool isSymmetric(TreeNode* root){
queue<TreeNode*> que;
if(root == nullptr) //根节点为空则对称
return true;
que.push(root->left); //否则将其左右子树进队列
que.push(root->right);
while(!que.empty()){ //每次迭代只判断一组对称位置的节点
TreeNode* left = que.front();
que.pop();
TreeNode* right = que.front();
que.pop();
if(!left && !right)
continue;
if(!left || !right || left->val != right->val)
return false;
que.push(left->left);
que.push(right->right);
que.push(left->right);
que.push(right->left);
}
return true;
}