对称二叉树
递归法
递归法,写起来会相对简单一些。
-
确定递归函数的返回值和参数
因为只需要判断是否对称即可,所以返回参数为布尔类型,形参为要比较的两个节点,left和right
public boolean compare(TreeNode left, TreeNode right){...}
-
确定终止条件
先来想一想在什么情况下,会返回false
-
left和right有一个为空,另一个不为空的时候
-
left和right都不为空,但是值不相等的时候
什么时候会返回true
-
当left和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;
-
-
确定循环体
分别找到外侧和内测,看看是否相等(用递归函数compare)
外侧:
boolean outside = compare(left.left, righ.right);
内侧:
boolean indise = compare(left.right, right.left);
最后把内外侧结果做与运算,得到最终返回值
class Solution { public boolean isSymmetric(TreeNode root) { if (root == null) return true; 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 outside = compare(left.left, right.right); boolean inside = compare(left.right, right.left); return outside && inside; } }
递归法
递归法理解起来相对来说比较费劲,是利用到了双端队列进行的结构
递归法从流程上来说,是先比较内侧节点,再往外延伸进行进一步的比较
我们直接先帖代码,根据代码来讲解
class Solution { public boolean isSymmetric(TreeNode root) { Deque<TreeNode> deque = new LinkedList<>(); deque.offerFirst(root.left); deque.offerLast(root.right); while (!deque.isEmpty()) { TreeNode leftNode = deque.pollFirst(); TreeNode rightNode = deque.pollLast(); if (leftNode == null && rightNode == null) { continue; } // if (leftNode == null && rightNode != null) { // return false; // } // if (leftNode != null && rightNode == null) { // return false; // } // if (leftNode.val != rightNode.val) { // return false; // } // 以上三个判断条件合并 if (leftNode == null || rightNode == null || leftNode.val != rightNode.val) { return false; } deque.offerFirst(leftNode.left); deque.offerFirst(leftNode.right); deque.offerLast(rightNode.right); deque.offerLast(rightNode.left); } return true; } }
此时我们定义一个二叉树,其中数据表示的是节点标号,不是节点存储的数值
-
刚开始的时候是2和3入队
-
que:2,3
-
取出队列的头和尾,作为leftNode和rightNode
-
经过条件语句判断
-
入队
deque.offerFirst(leftNode.left); deque.offerFirst(leftNode.right); deque.offerLast(rightNode.right); deque.offerLast(rightNode.left);
此时的que:5,4,7,6
-
-
开始第二轮循环
-
取出队列的头和尾
leftNode = 5,rightNode = 6(比较的是内测的两个节点)
-
经过条件语句判断
-
入队
deque.offerFirst(leftNode.left); deque.offerFirst(leftNode.right); deque.offerLast(rightNode.right); deque.offerLast(rightNode.left);
此时的que:11,10,4,7,13,12
-
-
开始第三轮的循环
-
取出队列的头和尾
leftNode = 11,rightNode = 12(依旧是下一层最内侧的两个点)
-
经过条件语句判断
-
入队
此时的que:10,4,7,13,12
-
-
此时的内侧的所有节点均比较完,开始比较剩余的其他相对内侧节点。开始第四轮循环。以此类推