当前位置: 首页 > news >正文

代码随想录刷题Day34

翻转二叉树

递归思路抽象出这个翻转的过程:先是对左右子树翻转,接着再交换左右孩子节点的位置:

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(!root) return root;else{invertTree(root->left);invertTree(root->right);TreeNode* tmp = root->left;root ->left = root -> right;root->right = tmp;return root;}}
};

对称二叉树

这个题目花了比较多时间思考和写,想过几种方案,都没能写出来,最后还得再看代码随想录的标准答案,才恍然大悟,原来也可以用递归的思路来解决。

首先,我自己最开始的思路,是基于上一题的翻转二叉树,我想的是,对要判断是否对称的二叉树root来一个翻转操作得到一棵新树root_invert,接着比较root和invert_root时候一致,如果一致,说明root本身就是对称的,否者说明root不是对称的。但是代码思想这个思路之后,在比较两棵树的时候,一直有bug出现,应该是细节不太对,卡了比较久,还是放弃了这条思路。

接着是粗略参考代码随想录的标准答案,看到可以用后序遍历+递归的思路,于是我还没想清楚就直接写代码,写代码是对左子树进行左右中的后序遍历,对右子树进行右左中的后序遍历,然后对得到的左子树的遍历序列和右子树的遍历序列进行比较,如果不一致则说明不是对称的,但是这样的做法,显然是没有考虑到题目给出的第二个样例的情况。对于分别只有一个孩子的左右子树,如果左子树存在的是右孩子,右子树存在的也是右孩子,如果值还一样,这在这样的思路下会得出这对节点是对称的误判结果。

最后,还是得认真参考官方题解,定义一个比较函数,用于比较左右两棵子树是否对称,具体的比较过程,先是左右子树根节点是否一致,接着是对子树的外侧和内侧接节点的比较,如此迭代下去。

class Solution {
public:bool compare(TreeNode* left,TreeNode* right){//比较左右孩子节点if(left == nullptr && right!= nullptr) return false;else if(left !=nullptr && right == nullptr) return false;else if(left ==nullptr && right ==nullptr) return true;else if(left->val != right->val) return false;//左右子树的内外侧比较bool outside = compare(left->left,right->right);bool inside = compare(left->right,right->left);return outside && inside;}bool isSymmetric(TreeNode* root) {return compare(root->left,root->right);}
};

做这两道题,感觉做对普通二叉树的一些性质的判断或者操作,可以优先考虑使用递归的思路,而想要用递归,得先找到递归的规律。

http://www.dtcms.com/a/336418.html

相关文章:

  • 上位机知识篇---静态库
  • 计算机网络 TCP 延迟确认机制
  • SpringCloud 01 分布式系统
  • 自由学习记录(85)
  • 【k8s、docker】Headless Service(无头服务)
  • 如何提高目标检测模型在小目标检测任务上的性能
  • 海洋牧场助力可持续发展,保护海洋生态平衡
  • CF2121A Letter Home
  • python pandas库 series如何使用
  • DNS总结
  • JDK21 虚拟线程详解【结合源码分析】
  • 弹性布局 Flexbox
  • BEVFusion(2022-2023年)版本中文翻译解读+相关命令
  • Java项目架构设计:模块化、分层架构的实战经验
  • Linux(十六)——top命令详解
  • wrap go as a telnet client lib for c to implement a simple telnet client
  • 堆的实际应用场景
  • 【Virtual Globe 渲染技术笔记】8 顶点变换精度
  • C11期作业17(07.05)
  • Microsoft WebView2
  • AMBA-AXI and ACE协议详解(十)
  • Rust:DLL 输出对象的生命周期管理
  • 影刀初级B级考试大题2
  • STM32CUBEMX配置stm32工程
  • Linux学习-多任务(线程)
  • LangChain4j
  • 三分钟在VMware虚拟机安装winXP教程,开箱即用
  • HTTP0.9/1.0/1.1/2.0
  • linux下timerfd和posix timer为什么存在较大的抖动?
  • USB-A 3.2 和 USB-A 2.0的区别