我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,p 指针和 q指针一开始都指向这棵树的根,随后 p右移时,q 左移,p 左移时,q右移。每次检查当前 ppp 和 qqq 节点的值是否相等,如果相等再判断左右子树是否对称。
public boolean isSymmetric(TreeNode root) {return ismySymmetric(root,root);}private boolean ismySymmetric(TreeNode p, TreeNode q) {if ( p ==null && q ==null){return true;}if (p == null || q==null){return false;}return p.val ==q.val&& ismySymmetric(p.left,q.right)&& ismySymmetric(p.right,q.left);}
方式二:迭代---leetcode官方的一种解法
引入一个队列,这是把递归程序改写成迭代程序的常用方法。初始化时我们把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束