package suanfa.tree;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingDeque;
/**
对称二叉树
采用递归的方法解决该题。判断二叉树是否为镜像涉及到的是左右两个子树,和根结点没有关系。因此定义函数isSymmetricCore,将两个子树头结点A、B作为传入函数的参数。
设置退出情况:
如果A、B都为空,说明前面的判断都已经满足要求,因此返回值为true
如果A和B中有一个为空,显然不匹配
如果A和B都不为空,判断A和B的值是否相等,如果相等,则继续比较A的左子树和B的有子树以及A的右子树和B的左子树;如果不等,则返回false
作者:emergence
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
/
public class Symmetric {public static void main(String[] args) {
TreeNode leftR = new TreeNode(); leftR.val = 3; TreeNode rightL = new TreeNode(); rightL.val = 3;
TreeNode left = new TreeNode(); left.val = 2; left.right = leftR; TreeNode right = new TreeNode(); right.val = 2; right.left = rightL; TreeNode root = new TreeNode(); root.val = 1; root.left = left; root.right = right; System.out.println(isSymmetric(root)); } public static boolean isSymmetric(TreeNode root) { if (root == null) return true; return compare(root.left, root.right); } public static Boolean compare(TreeNode left, TreeNode right) { if (left == null && right == null) { return Boolean.TRUE; } if (left != null && right == null) { return Boolean.FALSE; } if (left == null && right != null) { return Boolean.FALSE; } if (left.val != right.val) { return Boolean.FALSE; } if (left.right != null && right.left != null && left.right.val != right.left.val) { return Boolean.FALSE; } if (left.left != null && right.right != null && left.left.val != right.right.val) { return Boolean.FALSE; } return compare(left.left, right.right) && compare(left.right, right.left); } /** * 二叉树的层序遍历 依赖queue实现 * * @param root * @return */ public static boolean levelOrder(TreeNode root) { if (root == null) { return Boolean.TRUE; } List<List<Integer>> allList = new ArrayList<>(); Queue<TreeNode> queue = new LinkedBlockingDeque<>(); queue.add(root); while (!queue.isEmpty()) { List<Integer> subList = new ArrayList<>(); int currentLevelSize = queue.size(); if (allList.size() >= 1 && currentLevelSize % 2 != 0) { return Boolean.FALSE; } for (int i = 1; i <= currentLevelSize; i++) { TreeNode tmpNode = queue.poll(); subList.add(tmpNode.val); if (tmpNode.left != null) { queue.offer(tmpNode.left); } if (tmpNode.right != null) { queue.offer(tmpNode.right); } } int left = 0; int right = subList.size() - 1; while (left <= right) { if (!subList.get(left).equals(subList.get(right))) { return Boolean.FALSE; } left++; right--; } allList.add(subList); } return Boolean.TRUE; } static class TreeNode { int val; TreeNode left; TreeNode right; }
}