今天突然发现,在书写递归函数且函数有返回值时,一定要明白函数的返回值究竟是什么东西
- 思路一:递归
-
对称二叉树的特点就是,左右两侧的对称位置结点的val是一样的,所以对于我们的dfs函数参数需要有两个TreeNode,是左右两侧对应的结点。首先需要判断是否是null,这也是递归的终止条件~然后还需判断值是否相等,相等的话继续递归地调用dfs函数
-
在这里我们的dfs函数返回值是以该结点为根节点的子树是不是轴对称的
-
需要注意的是,关于结点是否为null的判断方法
if (null == left && null == right) return true; if (null == left || null == right) return false;
-
还有一点就是我们在递归调用dfs时因为是轴对称,所以应该left.right和right.left相对应
AC代码
class Solution { public boolean isSymmetric(TreeNode root) { return dfs(root.left, root.right); } boolean dfs(TreeNode left, TreeNode right) { if (null == left && null == right) return true; if (null == left || null == right) return false; return left.val == right.val && dfs(left.right, right.left) && dfs(left.left, right.right); } }
-
- 思路二:迭代
- 迭代的实现需要借助队列,注意此时的遍历不是此前用过的前序、中序、后序遍历的方法,而是先放入两次root到队列中,每次从队列取出两个值,先进行必要的null值判断,然后再判断val是否相等,相等的话再把对应位置的四个值放入。注意放入的顺序
class Solution { public boolean isSymmetric(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); queue.offer(root); while (!queue.isEmpty()) { TreeNode left = queue.poll(), right = queue.poll(); if (null == left && null == right) continue; if (null == left || null == right) return false; if (left.val != right.val) return false; queue.offer(left.right); queue.offer(right.left); queue.offer(left.left); queue.offer(right.right); } return true; } }