给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true
判断一个二叉树是不是对称二叉树,首先这里面的对称是两个树是不是对称的,,也就是根节点的左子树和右子树是不是对称的,那么在递归遍历的过程中,是要同时遍历两颗树的
对一棵树进行左右中,另一棵树进行右左中的遍历顺序
那么如果用递归的话,again递归三部曲。
1、确定返回值的类型:bool
2、确定终止条件:有以下几种情况
左节点为空、右节点不为空--->不对称----->return false;
左节点不为空、右节点为空----->不对称---->return false;
左节点为空,右节点为空---->对称---->return true;
左节点右节点不为空,且值相等---->对称---->return true
左节点右节点不为空,且值不相等---->不对称---->return false
3、确定单层循环的逻辑:
左子树的左边和右子树的右边
左子树的右边和右子树的左边
以上两种情况都满足就符合
class solution
{
public:
bool compare(TreeNode* left, TreeNode* right)
{
//确定终止条件
if (left == NULL && right == NULL)return true; //左右节点都为空,对称;
else if (left == NULL && right != NULL || left != NULL && right == NULL)return false; //左节点为空且右节点不为空,不对称;左节点不为空且右节点为空,不对称.
else if (left->val != right->val)return false; //左右节点都不为空,比较节点数值,不相同就false
//确定单层循环的逻辑
bool outside = compare(left->left, right->right);
bool inside = compare(left->right, right->left);
bool isSame = outside && inside;
return isSame;
}
bool isSymmetric(TreeNode* root)
{
if (root == NULL)return true;
return compare(root->left, root->right);
}
};