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

代码随想录 101.对称二叉树

1.问:什么样的题目采用后序遍历?

答:需要收集孩子的信息,向上一层返回的题目。具体来说,左右中的遍历顺序,可以使二叉树先收集左孩子的信息和右孩子的信息,中的处理过程中则会将孩子的处理信息向上一层返回。

2.弄清楚要比较的节点,要比较的节点并非左右节点,而是根节点的左右子树是否是可以相互翻转的,即要比较的是根节点的左右子树。

3.如何比较?  比较两个子树的里侧和外侧元素是否相等,如图所示。

4.由于要通过递归函数的返回值判断两个子树的内侧节点和外侧节点是否相等,所以应采用后序遍历。具体来说,要遍历两棵树而且要比较内侧和外侧节点,准确来说一个树的遍历顺序是左中右,一个树的遍历顺序是右左中。

方法一:

DFS递归:采用后序遍历的思想。

1.确定参数和返回值:

(1)参数:因为要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两棵树,参数自然也是左子树节点和右子树节点。

(2)返回值:自然是bool类型。

boolean compare(TreeNode left, TreeNode right)

2.确定终止条件:先考虑有节点为空的情况,剩下的情况就是左右节点都不为空的情况。

(1)左节点为空,右节点不为空,不对称,return false

(2)左节点不为空,右节点为空,不对称,return false

(3)左右节点都为空,对称,return true

(4)剩下的就是左右节点都不为空的情况:左右节点都不为空,比较节点数值,不相同就return false

        if (left == null && right != null) {return false;}if (left != null && right == null) {return false;}if (left == null && right == null) {return true;}if (left.val != right.val) {return false;}

3.确定单层递归的逻辑:单层递归的逻辑用来处理左右节点都不为空,且数值相同的情况。

(1)比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子;

(2)比较内侧是否对称:传入左节点的右孩子,右节点的左孩子;

(3)如果左右都对称就返回true,一侧不对称就返回false;

        // 比较外侧boolean compareOutside = compare(left.left, right.right);// 比较内侧boolean compareInside = compare(left.right, right.left);return compareOutside && compareInside;

(4)上述代码可以看出使用的遍历方式,左子树左右中,右子树右左中,所以这个遍历顺序并非严格的“后序遍历”。

附代码:

class Solution {public boolean isSymmetric(TreeNode root) {return compare(root.left,root.right);}public boolean compare(TreeNode left,TreeNode right){if(left == null && right != null){return false;}if(left != null && right == null){return false;}if(left == null && right == null){return true;}if(left.val != right.val){return false;}//比较外侧 左子树:左 右子树:右boolean compareOutside = compare(left.left,right.right);//比较内侧 左子树:右 右子树:左boolean compareInside = compare(left.right,right.left);//逻辑处理 左子树:中 右子树:中//逻辑与,只有外侧和内侧都对称,这棵二叉树才对称return compareOutside && compareInside;  }
}

方法二:

迭代实现,使用队列来比较两个树(根节点的左右子树)是否相互翻转,这里并非层序遍历。通过队列判断根节点的左子树和右子树的内侧和外侧是否相等。

附代码:

class Solution {public boolean isSymmetric(TreeNode root) {LinkedList<TreeNode> queue = new LinkedList<>();if(root == null){return true;}queue.add(root.left);queue.add(root.right);while(queue.size()>0){TreeNode leftNode = queue.remove();TreeNode rightNode = queue.remove();//左右节点都为空if(leftNode == null && rightNode == null){continue;}//其他三个情况合并if(leftNode == null || rightNode == null || leftNode.val != rightNode.val){return false;}//注意队列放入顺序,通过队列判断左子树和右子树的内侧和外侧是否相等queue.add(leftNode.left);queue.add(rightNode.right);queue.add(leftNode.right);queue.add(rightNode.left);}return true;}
}

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

相关文章:

  • 深圳网站建设哪家比较专业大学城网站开发公司
  • 制作静态链接库并使用
  • 西方设计网站vs2010网站开发与发布
  • 网站维护工作的基本内容施工企业质量管理体系认证几年
  • 网站建设教程pdf下载企业官网网页设计
  • 重启MySQL,为何重启后MySQL数据“回滚”了?
  • 非洲购物网站排名文创产品设计包括哪些方面
  • Linux 文件内容查看与编辑
  • 2022 CSP-J复赛题
  • 【cubeide】IIC通信
  • python学习之访问模式和文件定位操作
  • CTF攻防世界WEB精选基础入门:simple_php
  • CodexField 热度登顶:内容资产化赛道的加速信号
  • 00_k8s容器编排系统
  • 广西柳州网站制作公司厦门做网站排名
  • 算法学习 02
  • 广西建设监理协会官网站珠海响应式网站建设推广公司
  • 机器学习实践项目(一)- Rossman商店销售预测 - 特征工程
  • 网站首页轮播图片wordpress不支持中文
  • Blender经典像素风模拟插件 Drips Psx Efx – Playstation 1 Effects V1.4
  • 网站 备案 固话福州网站设计软件公司
  • 达梦数据库版本升级方案
  • 【开题答辩全过程】以 北上广咖啡门店分布与销售数据分析和可视化为例,包含答辩的问题和答案
  • 企业信息门户网站 建设基于多站点的网站内容管理平台的管理与应用
  • 基于Vue的高校学习讲座预约系统
  • 钦州网站建设哪家便宜莆田企业自助建站系统
  • 怎样做自己的视频网站建设网站工作室的问题疑问
  • 网站 图片水印wordpress文章数据库
  • KMSEnvelope Encryption
  • 成都住房和城乡建设厅网站鼠标垫东莞网站建设