题目:
对称二叉树题目
由题意:关于轴对称其实是一种镜像对称。
①当只有一个节点,那么一定是对称的。
②当有多个节点,如果根节点相同,那么需要判断左右子树。与判断相同的树相似,但是是左子树的左节点是否和右子树的右节点相同,左子树的右节点是否与右子树的左节点相同。
思路
- 如果根节点为空,空树,那么一定是对称的,返回TRUE。
- 如果根节点不为空,那么就需要进一步判断左右子树。判断左右子树是不是镜像。左右子树为空,说明只有一个节点,那么满足对称返回TRUE。
- 如果左右只有一个为空 ,那么不满足对称。
- 如果左右均不为空,需要进一步判断值,若节点值相等,此时就是化为子问题,需要进行进一步判断。就是左孩子的右孩子和右孩子的左孩子进行比较,以及 左孩子的左孩子和右孩子的右孩子进行比较。即变成关于两个节点的比较。
终止条件:
1、left 和 right 不等,或者 left 和 right 都为空
2、递归的比较 left的left 和 right的 right,递归比较 left的 right 和 right的 left
不对称的例子:
对称的例子:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//判断左右子树是否镜像相等
bool isequal(struct TreeNode* left,struct TreeNode* right)
{
//
if(left==NULL && right==NULL)
{
return true;
}
//如果只有一个为空,FALSE
if(left==NULL||right==NULL)
{
return false;
}
if(left->val!=right->val)
{
return false;
}
//传的就是左孩子的右孩子和右孩子的左孩子进行比较
//以及 左孩子的左孩子和右孩子的右孩子进行比较
return isequal(left->left,right->right)
&&isequal(left->right,right->left);
}
bool isSymmetric(struct TreeNode* root){
//判断根节点,以根节点为对称轴
if(root==NULL)
{
return true;
}
//如果不为空,需要判断左右子树
//判断左右子树是否镜像相等
return isequal(root->left,root->right);
}