判断二叉树是否对称(NC16/考察次数Top61/难度简单)
Posted 码农指南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断二叉树是否对称(NC16/考察次数Top61/难度简单)相关的知识,希望对你有一定的参考价值。
描述:
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
注:如果是自身的镜像则可以沿着中轴线转动
示例1
输入:
1,2,2
返回值:
true
(题目来自牛客网)
用C++实现如下
class Solution
public:
/**
*
* @param root TreeNode类
* @return bool布尔型
*/
bool isSymmetric(TreeNode* root)
// //思路1,递归法,判断是否对称,直接判断每个左右节点是不是对称的即可,另外写一个递归函数isChildSymmetic()
// if(!root)
// return true;
// return isChildSymmetic(root->left,root->right);
//
// bool isChildSymmetic(TreeNode* left,TreeNode* right)
//
// if(!left && !right) //左右节点的指针都为空
// return true;
// if(left == nullptr ^ right == nullptr) //左右节点的指针是否为空结果不相同时
// return false;
// if(left->val != right->val) //左右节点的值是否一样
// return false;
// return isChildSymmetic(left->left, right->right) && //判断左左与右右,以及左右与右左,是否都对称
// isChildSymmetic(left->right, right->left);
//
//思路2,迭代法,借助两个stack栈来实现
//第一步,确定根部的情况
if(!root)
return true;
if(!root->left && !root->right) //左右都为空
return true;
if(root->left == nullptr ^ root->right == nullptr) //左右不一样则满足
return false;
queue<TreeNode*> s1,s2; //定义两个queue,用来存放节点,用于依次遍历
s1.push(root->left); //根部左节点push到s1中
s2.push(root->right); //根部右节点push到s2中
while(!s1.empty() && !s2.empty()) //(1)全部都不为空的时候
//先取值,弹,判断,压
TreeNode* node1 = s1.front(); //每次拿s1中首部元素
TreeNode* node2 = s2.front(); //每次拿s2中首部元素
s1.pop();
s2.pop();
if(node1->val != node2->val) //节点的值不一样,则为false
return false;
if(node1->left == nullptr ^ node2->right == nullptr) //1的左节点 与 2的右节点 指针是否为空不一致
return false;
if(node1->right == nullptr ^ node2->left == nullptr) //1的右节点 与 2的左节点 指针是否为空不一致
return false;
if(node1->left) //node1有左,右节点时,依次push进去
s1.push(node1->left);
if(node1->right)
s1.push(node1->right);
if(node2->right) //node2有右,左节点时,依次push进去
s2.push(node2->right);
if(node2->left)
s2.push(node2->left);
if(s1.empty() && s2.empty()) //(2)全为空
return true;
return false; //(3)其它
;
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!
以上是关于判断二叉树是否对称(NC16/考察次数Top61/难度简单)的主要内容,如果未能解决你的问题,请参考以下文章
二叉树中是否存在节点和为指定值的路径(NC9/考察次数Top63/难度简单)