101. 对称二叉树
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
1 | 输入:root = [1,2,2,3,4,4,3] |
示例 2:
1 | 输入:root = [1,2,2,null,3,null,3] |
提示:
- 树中节点数目在范围
[1, 1000]
内 -100 <= Node.val <= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
题解:
递归写法:
确定参数和返回值
- 因为比较的是两颗子树是否是相互翻转的,进而判断这两颗子树是不是对称的,所以要比较的是两颗子树,参数为左子树节点和右子树节点
- 返回值为boolean类型
确定递归出口
比较两个节点值的情况,分为节点为空和节点不为空两种情况。
首先是节点为空:
- 左节点为空,右节点不为空,返回false
- 左节点不为空,右节点为空,返回false
- 左右节点均为空,两节点对称,返回true
然后是两节点都不为空:
- 左右节点值不相等,返回false
- 左右节点值相等,递归比较内外侧左右节点。
- 比较内侧,传入左节点的右孩子和右节点的左孩子
- 比较外侧,传入左节点的左孩子和右节点的右孩子
- 左右都对称返回true,有一侧不对称返回false
递归代码如下:
1 | public boolean isSymmetric(TreeNode root) { |
迭代写法:
使用双端队列,将相应对称的节点存入双端队列的两边,然后取出进行比较,看值是否相同,然后依次比较内外子树。
1 | public boolean isSymmetric(TreeNode root) { |