对称二叉树
1.解题思路:
方法一:调用翻转二叉树和相同二叉树的接口
空树就是对称二叉树,返回true;
将根节点的左子树翻转,判断翻转之后根的左右子树是否相同,相同返回true,不同返回false;
方法二:定义一个函数来判断树的左边是否等于树的右边,带用这个接口来判断
一棵树要为对称二叉树,那么这棵树一个节点的左孩子的左边的值就要等于这个节点的右孩子的右边的值,这棵树一个节点的左孩子的右边的值就要等于这个节点的右孩子的左边的值
空树也是对称二叉树,返回true;
树非空,调用定义的函数判断这棵树的左右两边是否相等;
2.实现代码:
方法一:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//方法一:调用翻转二叉树和相同二叉树的接口
//翻转二叉树
struct TreeNode* invertTree(struct TreeNode* root){
if(root == NULL)
return NULL;
//交换左右子树
//先交换左右节点
struct TreeNode* tmp=root->left;
root->left=root->right;
root->right=tmp;
//再交换左右节点自身的左右节点
invertTree(root->left);
invertTree(root->right);
return root;
}
//判断两棵树是否相同
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
//两个根节点都为空,相同
if(p==NULL && q== NULL)
return true;
//两个根节点只有一个为空,不相同
if(p==NULL || q==NULL)
return false;
//两棵树的根节点和左右孩子节点是否都相同,是的话相同,否的话不同
return p->val == q->val && isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}
bool isSymmetric(struct TreeNode* root){
if(root == NULL)
return true;
root->left=invertTree(root->left);
//翻转之后根的左右孩子是否相等
return isSameTree(root->left,root->right);
}
方法二:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//方法二:定义一个函数来判断树的左边是否等于树的右边
//判断树的左边是否等于树的右边
bool isSym(struct TreeNode* left,struct TreeNode* right){
//左右两边都为空,两边相等
if(left == NULL && right == NULL)
return true;
//左右两边只有一边为空,两边不相等
if(left == NULL || right == NULL)
return false;
//如果两边节点的值相同,且两边的节点的左边都等于右边,返回true
return left->val == right->val
&& isSym(left->left,right->right)
&& isSym(left->right,right->left);
}
bool isSymmetric(struct TreeNode* root){
//空树也是对称二叉树
if(root == NULL)
return true;
//树非空,判断这棵树的左右两边是否相等
return isSym(root->left,root->right);
}
3.OJ链接:
https://leetcode-cn.com/problems/symmetric-tree/submissions/
我行你也行!加油!