知识点
树,队列,模拟
解题思路
方法一:模拟,队列
要看整棵树的结构是否对称,我们看树的每一层结构是否对称,使用到的就是层序遍历。
将每一层节点放进队列中,消耗队列中的节点,如果有左右子节点又放进对列中供下一次消耗。
看每一层对应节点值是否相等,还需要将每一层节点值放进list进行比较。
方法二:树,递归
将树看成两颗树进行比较,即树A的左节点等于树B的右节点,树A的右节点等于树A的左节点。
递归看是否所有节点相等。
Java解题
方法一:
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return bool布尔型 */ public boolean isSymmetric (TreeNode root) { // write code here Deque<TreeNode> treeNodes1 = new LinkedList<>(); //外层循环队列 Deque<TreeNode> treeNodes2 = new LinkedList<>(); //内存循环队列 List<Integer> list = new ArrayList<>(); //保存每一层节点的值 if (root != null) { treeNodes1.offerLast(root); } while (!treeNodes1.isEmpty()) { //验证每一层节点的值是否是对称的 for (int i = 0; i < list.size() / 2; i++) { if (list.get(i) != list.get(list.size() - i - 1)) { return false; } } list.clear(); //将外层循环队列中的节点全部放到内存队列 while (!treeNodes1.isEmpty()) { treeNodes2.offerLast(treeNodes1.pollFirst()); } //遍历内存队列 while (!treeNodes2.isEmpty()) { TreeNode node = treeNodes2.pollFirst(); //将子节点放到外层队列和list中 if (node.left != null) { treeNodes1.add(node.left); list.add(node.left.val); } else { list.add(-1); //如果为空要添加一个代表空的值 } if (node.right != null) { treeNodes1.add(node.right); list.add(node.right.val); } else { list.add(-1); } } } return true; } }
方法二:
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return bool布尔型 */ public boolean isSymmetric (TreeNode root) { // write code here return fun(root, root); } public boolean fun(TreeNode root1, TreeNode root2){ if((root1 != null && root2 == null) || (root1 == null && root2 != null)){ return false; } if(root1 == null && root2 == null){ return true; } if(root1.val != root2.val){ return false; } return fun(root1.left,root2.right) && fun(root1.right,root2.left); } }