春节后第一题,祝各位码友牛年大吉!(2021年2月18日)
最近两周,各种大厂为什么都爱考树?! 热门前4全是树 +链接
TOP1 重建二叉树(https://blog.csdn.net/have_a_cat/article/details/113386251)
TOP2 链表中的节点每k个一组翻转(https://blog.csdn.net/have_a_cat/article/details/113561561)
TOP3 判断链表中是否有环(代码已AC,后续上教程)
TOP4 判断二叉树是否对称(本题)
题目描述
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如:下面这棵二叉树是对称的
1
/ \
2 2
/ \ / \
3 4 4 3
下面这棵二叉树不对称。
1
/ \
2 2
\ \
3 3
题目分析
题目想判断一棵二叉树是否为轴对称,快速判断出本题考察:树的遍历+递归
下面举例两个树:
我们按照下述流程,来判断给出的一棵树是否对称:
(1)如果不是空树(root!=NULL),把它划分为tree1和tree2
(2)这里编写个函数bool isLRSame(TreeNode* tree1, TreeNode* tree2),递归调用isLRSame(tree1, tree2)
①如果tree1和tree2都为空,返回true;
②如果tree1和tree2中只有一个为空,返回false;
③如果tree1和tree2都不为空,开始比较:
⒈tree1和tree2的值一样,(判断tree1左子树与tree2右子树isLRSame(tree1-->left, tree2-->right)) && (判断tree1右子树与tree2左子树isLRSame(tree1-->right, tree2--left))
⒉tree1和tree2的值不一样,返回false
(图片看不清楚的话,推荐 右键-->另存为,离线看,高清的图片哦)
C++代码:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
bool isLRSame(TreeNode* tree1, TreeNode* tree2)
{
int k = 0;
if(tree1==NULL)
{
k++;
}
if(tree2==NULL)
{
k++;
}
switch(k)
{
case 2:/*①如果tree1和tree2都为空,返回true;*/
{
return true;
break;
}
case 1:/*②如果tree1和tree2中只有一个为空,返回false;*/
{
return false;
break;
}
case 0:/*③如果tree1和tree2都不为空,开始比较:*/
{
if(tree1->val == tree2->val)/*⒈tree1和tree2的值一样,(判断tree1左子树与tree2右子树isLRSame(tree1-->left, tree2-->right)) && (判断tree1右子树与tree2左子树isLRSame(tree1-->right, tree2--left))*/
{
return(isLRSame(tree1->left,tree2->right)&&isLRSame(tree1->right,tree2->left));
}
else/*⒉tree1和tree2的值不一样,返回false*/
{
return false;
}
}
default:
{
return false;
}
}
return false;
}
/**
*
* @param root TreeNode类
* @return bool布尔型
*/
bool isSymmetric(TreeNode* root) {
// write code here
if(root==NULL)/*如果不是空树(root!=NULL),把它划分为tree1和tree2*/
{
return true;
}
else
{
return (isLRSame(root->left, root->right));
}
}
};