题解 | #对称的二叉树#
对称的二叉树
https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb
两种思路,层序遍历判断对称,或是直接在递归中判断。
//思路,可以用层序遍历,每一层的结果在数组中一定是镜像的。
//判断时直接在数组中预判下一层即可。
bool isSymmetrical_v1(TreeNode* pRoot) {
if(pRoot==NULL)
return true;
queue<TreeNode*>q;
vector<TreeNode*>children;
int parent=1;
int childNum=0;
q.push(pRoot);
while(!q.empty())
{
TreeNode* Current=q.front();
q.pop();
parent--;
children.push_back(Current->left? Current->left:NULL);
children.push_back(Current->right? Current->right:NULL);
childNum+=2;
//本层的节点都出队了,即下一层的节点都进入数组了
if(parent==0)
{
for(int i=0;i<childNum/2;i++)
{
//如果都不为空
if( children[i] && children[childNum-i-1] )
{
if(children[i]->val!=children[childNum-i-1]->val){
return false;
}
//如果都为空
}
else if((!children[i]) && (!children[childNum-i-1]))
{
continue;
}
else//如果一边为空一边不为空。
{
return false;
}
}
for(auto child:children)
{
if(child==NULL){
childNum--;
continue;
}
q.push(child);
}
//对状态重新初始化。
children.clear();
parent=childNum;
childNum=0;
}
}
return true;
}
//从排行榜抄来的递归思路。
bool isSymmetrical(TreeNode* pRoot) {
//思路:辅助递归函数比较两节点是否符合,符合就递归往下
if(!pRoot) return true;
return helper(pRoot->left,pRoot->right);
}
bool helper(TreeNode* left,TreeNode* right){
//如果目标的两个节点都不存在,那肯定是对称的
if(!left && !right) return true;
//如果目标的两个节点只有其中一个存在,或是即使是存在了但值不相等,则不对称
if((!left || !right || left->val != right->val)) return false;
//让左节点的左节点与右节点的右节点比较,让左节点的右节点与右节点的左节点比较
//这样才能也满足镜像。
return helper(left->left,right->right) && helper(left->right,right->left);
}
顺丰集团工作强度 274人发布