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;
}}

京公网安备 11010502036488号