牛客网-21天刷题计划-第2节 进阶-对称的二叉树
使用非递归的二叉树遍历实现。
#include<iostream>
using namespace std;
const int maxn=10000;/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
//头节点为空
if(pRoot==NULL)return true;
//定义变量
int top=-1;
TreeNode*pl[maxn],*pr[maxn],*p_l,*p_r;
//初始化栈
top++;pl[top]=pr[top]=pRoot;
//左右序遍历
while(top!=-1)
{
//头节点出栈
p_l=pl[top];p_r=pr[top];top--;
//判断是否对称
if(p_l->val!=p_r->val)return false;
bool bpll=p_l->left==NULL,bplr=p_l->right==NULL;
bool bprl=p_r->left==NULL,bprr=p_r->right==NULL;
if((bpll^bprr)||(bplr^bprl))break;
//将子节点入栈
if(p_l->left!=NULL)
{
top++;
pl[top]=p_l->left;
pr[top]=p_r->right;
}
if(p_l->right!=NULL)
{
top++;
pl[top]=p_l->right;
pr[top]=p_r->left;
}
}
return top==-1;
}
};
经过数十次的提交最后终于过了
第一次找出没有考虑这个if(pRoot==NULL)return true;
提交多次,会想以前写过的遍历算法,递归和非递归都是一样的思路,没有什么漏洞
怀疑栈定义的问题,将maxn改为1000没有用,又改成1e6还是没有用
看了一眼老师和其它同学的提交记录都是使用递归的方法,开始就是怀疑栈溢出,但是使用了数组栈还是溢出应该不可能
整理了一下思路,有看是整理了一下代码
第二次找出判断出错
bool bpll=p_l->left==NULL,bplr=p_l->right==NULL;
bool bprl=p_r->left==NULL,bprr=p_r->right==NULL;
if((bpll^bprr)||(bplr^bprl))break;
还是不行,继续往下找,发现入栈时,判断是这样写的if(p_l!=NULL)and if(p_l!=NULL)
改了过来,过了10%
开始肯定了自己的逻辑,找了一下代码,没错
第三次找出题意的对称不仅仅是形状上的对称,数值上也要对称相等,加上了if(p_l->val!=p_r->val)return false;
然后就过了。
思路:形状上的对称只要,同时先序遍历后序遍历,如果同时存在相同的子节点就对称,数值就在判断子节点的时候,判断一下数值就行。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!