剑指Offer_编程题——对称的二叉树

题目描述:

请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

具体要求:

时间限制: C/C++ 1秒,其他语言2秒
空间限制: C/C++32M,其他语言64M

具体实现:

思路一:

根据本题对二叉树的对称性的定义可知:如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。因此,我们首先要找出二叉树的镜像,其实这个在我们之前的文章中做过这么一道题目。只要用其中的递归方法找到该二叉树的镜像,然后再通过交换左右子树将其二叉树对称实现,这里需要注意的是:空子树的情况我们也要考虑。具体用java实现如下:

public class Solution{boolean isSymmetrical(TreeNode pRoot){TreeNode node = getMirror(pRoot);return isSymmetrical(pRoot, node);}boolean isSymmetrical(TreeNode pRoot, TreeNode node){if(pRoot == null && node == null)return true;else if(pRoot == null || node == null)return false;if(pRoot.val  == node.val)return isSymmetrical(pRoot.left, node.left) && isSymmetrical(pRoot.right, node.right);return false;}TreeNode getMirror(TreeNode pRoot){if(pRoot == null){return null;}TreeNode root = new TreeNode(pRoot.val);root.right = getMirror(pRoot.left);root.left = getMirror(pRoot.right);return root;}
}

代码效果图如图所示:

正如前面说的那样,如果在牛客网中,我们可以直接通过,但是如果是本地的编译器,则还需要定义其结点,具体结点的实现定义用java实现如下:

public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;TreeNode next = null;TreeNode(int val) {this.val = val;}
}

思路二:

首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同,左子树的右子树和右子树的左子树相同即可,采用递归,另外非递归也可,采用栈或队列存取各级子树根节点。若果二叉树结点值相同,但是不对称,上述方法结果不对,故需要比较空结点位置是不是相同。具体我们用java和python两种编程语言将其实现:

1、首先我们用java将其实现:

public class Solution{boolean isSymmetrical(TreeNode pRoot){if(pRoot == null)return true;return isSymmetrical(pRoot.left, pRoot.right);}private boolean isSymmetrical(TreeNode left, TreeNode right){if(left == null && right == null) return true;if(left == null || right == null)return false;if(left.val == right.val)return isSymmetrical(left.left, right.right) && isSymmetrical(left.right, right.left);return false;}
}

代码效果图如图所示:

2、接下来我们用Python将其实现:

class Solution:def isSymmetrical(self, pRoot):return self.is_Symmetrical(pRoot, pRoot)def is_Symmetrical(self, p,  q):if p == None and q  == None:return Trueif p == None or q == None:return Falseif p.val != q.val:return Falsereturn self.is_Symmetrical(p.left, q.right) and self.is_Symmetrical(p.right, q.left) 

代码效果图如图所示:

但是在本地编译器中我们还需要定义链表结构才能正常运行,具体用python定义链表结构实现如下:

class TreeNode:def __init__(self, pNode):self.val = xself.left = Noneself.right = None

思路三:

其实与思路二差不多,就是在思路二的基础上进行了简单的改造。当我门对所有空的情况考虑结束之后,我们应该考虑当对称结点不相等,认为错误。对称结点相等,考虑它们的下一层结点,注意(右结点的右孩子——左结点的左孩子,右结点的左孩子——左结点的右孩子)。具体我们分别用java和python两种语言将其实现:

1、首先我们用java将其实现:

public class Solution{boolean isSymmetrical(TreeNode pRoot){if(pRoot ==  null)return true;return help(pRoot.left, pRoot.right);}boolean help(TreeNode node1, TreeNode node2){if(node1 == null && node2 == null)return true;if(node1==null && node2!=null)return false;if(node1!=null && node2==null)return false;if(node1.val!=node2.val)return false;return help(node1.left, node2.right)&&help(node1.right, node2.left);}
}

代码效果图如图所示:

2、接下来我们用python将其实现:

class Solution:def isSymmetrical(self, pRoot):head = pRootif head == None:return Trueif head.left == None and head.right == None:return Truereturn self.judge(head.left, head.right)def judge(self, right, left):if right == None and left == None:return Trueif right == None or left == None:return Falseif right.val != left.val:return Falsereturn self.judge(right.right, left.left) and self.judge(right.left, left.right)

代码效果图如图所示:

思路四:

给定一个二叉树,检查它是否是镜像对称的。例如,二叉树[1,2,2,3,4,4,3]就是对称的。具体该二叉树如下图所示:

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

因此,我们可以利用容器队列先入先出,其实容器的选择没有影响,借用两个容器,存储左右子节点的值,不论是队列还是栈,先入先出或者先入后出,只要出来的数字相等就可以。不过这里我们选择java中的LinkedList容器。前面我们介绍了递归的解法。现在我们给大家用Java实现迭代。具体实现如下:

import java.util.Stack;
public class Solution{boolean isSymmetrical(TreeNode pRoot){if(pRoot == null)return true;Stack<TreeNode> s = new Stack<>();s.push(pRoot.left);s.push(pRoot.right);while(!s.isEmpty()){TreeNode right = s.pop();TreeNode left = s.pop();if(right == null && left == null)continue;if(right == null || left == null)return false;if(right.val != left.val)return false;s.push(left.left);s.push(right.right);s.push(left.right);s.push(right.left);}return true;}
}

代码效果图如图所示:

总结

本题主要通过二叉树的对称来考察二叉树遍历中的层次遍历。前面有一道二叉树的镜像与本题考察的内容相似,只不过本题在此基础上进行了延续,要考虑其子树为空的情况。本文给出了四种解题思路,并且分别用java和python两种主要的编程语言将其实现。并且用到了我们经常在树中用到的递归以及迭代的思路,在迭代的过程中,我们还用到了栈。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!

参考文献

[1]vivia

[2]悠风号

[3]明月几时有.

[4]yg838457845

java已知一个二叉树_Day58:对称的二叉树相关推荐

  1. java已知一个二叉树_#二叉树复习#

    #二叉树复习# 目录 满二叉树 完全二叉树 平衡二叉树 二叉树的主要性质 --二叉树的度 --二叉树的深度计算 二叉树的遍历 其他 符号变量     结点总数     深度     度为0的结点数/叶 ...

  2. java已知一个二叉树_大牛带你学 | 由二叉树的遍历序列求二叉树结构的解题方法归纳...

    前言 二叉树章节 属于数据结构考察的三大重点章节(线性表.树.图)之一,不管是在自命题院校考察和408统考都是考察频次很高的考点.今天,大牛学长就来为各位同学总结归纳一个二叉树知识考察中的常见题型的解 ...

  3. java入门-2-【入门】已知一个圆的半径,求解该圆的面积和周长 【运算符】

    题目详情 已知一个圆的半径,求解该圆的面积和周长. 输入 输入只有一行,只有1个整数. 输出 输出只有两行,一行面积,一行周长.(保留两位小数). 令pi=3.1415926 import java. ...

  4. java正方形矩阵_已知一个NxN的矩阵A,求矩阵中所有边长为m的正方形的子矩阵

    已知一个NxN的矩阵A,求矩阵中所有边长为m的正方形的子矩阵内元素的中位数.(m 例子: // m = 3 n = 5 // 01234 ݂         //  0 11357 ݂         ...

  5. JAVA已知圆心经纬度和半径求圆周点的经纬度

    JAVA已知圆心经纬度和半径求圆周点的经纬度 项目中遇到一个需求,需要根据传入的圆心经纬度和半径参数获得圆周点的经纬度,在网上查询了很多没有找到能用的算法,从GPT中获取到了一个简洁的用java实现的 ...

  6. 建立二叉树:已知层次遍历顺序建立二叉树、已知先序遍历顺序建立二叉树

    其他二叉树知识!二叉树知识汇总 目录 前提知识: 约定: 二叉树节点的存储结构: 创建一个节点: 建立二叉树的几种方法: 一.已知先序遍历顺序,构建二叉树.(链式存储) 二.已知层次遍历顺序,构建二叉 ...

  7. SAP HUM已知一个内部HU号码,如何得到HU号码?

    SAP HUM已知一个内部HU号码,如何得到HU号码? 去表VEPO 查数据即可, 为什么HU要有internal HU号码 ? Prior to the existence of HUM, in W ...

  8. html如何获得网址,已知一个网址,如何获得该网址对应的html源代码?在del 找人事管理软件...

    销售管理软件版1楼: 已知一个网址,如何获得该网址对应的html源代码?在delphi中如何实现?今天不解决,没饭吃了... 2楼: 用WebBrowser控件,先把网址传给WebBrowser,然后 ...

  9. c#中已知一个外部窗口的句柄,怎么关闭

    已知一个外部窗口的句柄,怎么关闭它.怎么给这个窗口的一个文本框设置内容. --------------------------------------------------------------- ...

最新文章

  1. 评论,转自于《低端没出路,请接触高端!》
  2. codeforces1496 D. Let‘s Go Hiking(乱搞+讨论)
  3. 开机流程与主引导分区(MBR)
  4. 博士期间要注意的几个问题
  5. java数值精度问题
  6. c/c++中指针数组和数组指针的区别
  7. Excel POI 导入导出(支持大数据量快速导出)
  8. 【数字信号处理】基本序列 ( 复指数序列 | 单位复指数序列 | 复变函数欧拉公式 )
  9. Semantic-UI某些图标不能显示+资源引入两种方式
  10. Linux学习-man和Info
  11. rails consol reload!
  12. 智比奈特万兆光口网卡 ZB-10G-1F 驱动安装和带宽测试
  13. 微信小程序之三元操作符
  14. 你运营的公众号文章阅读量上不来,怎么回事?
  15. ESET NOD32 互联网安全软件和防毒软件 -简单,可靠的防护。
  16. 计算机文字输入原理,也谈计算机汉字键盘设计“三原理”
  17. 兄弟们,我又回来了,干货太多让你们久等了
  18. PCA针对TE过程(田纳西伊斯曼过程)数据的故障监测处理
  19. 岁末年初,为你打包了一份技术合订本
  20. HAWKER叉车蓄电池 FLEX LI3 现已通过 UL 2580 认证 霍克叉车电瓶

热门文章

  1. Cissp-【第3章 安全工程】-2021-1-31(205页-237页)
  2. python读取视频占用内存太大_视频流用多进程读写,内存溢出怎么办?
  3. Android BLE开发(一):串口调试
  4. java rect平移_如何在Java Swing中使用鼠标平移图像
  5. ppt格式刷快捷键_高效地制作PPT
  6. mysql 中的 utf_Mysql中的utf-8竟然是假的!
  7. mysql登陆 host_mysql远程可以登陆本地登陆不了(user表中host字段的通配符%)
  8. mysql 连接 分组_详解MySQL中的分组查询与连接查询语句
  9. 导入json数据到Elasticsearch(bulk方法)
  10. git 创建新分支,合并分支等问题