题目链接:https://leetcode.com/problems/symmetric-tree/
题目:Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / 2 2 / \ / 3 4 4 3
But the following is not:
1 / 2 2 \ 3 3
解题思路:题目大意为给定一个二叉树,判断是否为对称的镜像二叉树。解题思路有递归和非递归两种。
非递归的思路是层次遍历二叉树,每层的元素都是对称的。代码如下:
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class Solution { public boolean isSymmetric(TreeNode root) { if(root==null) return true; LinkedList<TreeNode> list=new LinkedList<>(); //层次遍历使用的队列 LinkedList<TreeNode> list2=new LinkedList<>(); //每一次遍历后要将子节点放入队列中 TreeNode node=null; list.addLast(root); while(!list.isEmpty()) { LinkedList<Object> templist=new LinkedList<>(); while(!list.isEmpty()) { node=list.removeFirst(); if(node.left==null) { templist.add("#"); } else { templist.add(node.left.val); list2.add(node.left); } if(node.right==null) { templist.add("#"); } else { templist.add(node.right.val); list2.add(node.right); } } if(!isSymmetric(templist)) { //该层不对称,返回false return false; } else { //将子节点放入队列,继续遍历 while(!list2.isEmpty()) { list.addLast(list2.removeFirst()); } } } return true; } //判断每一层遍历的结果是否为对称的 private boolean isSymmetric(LinkedList<Object> templist) { for(int i=0,j=templist.size()-1;i<=j;) { if(templist.get(i).equals(templist.get(j))) { i++; j--; } else return false; } return true; } }
递归的代码如下:
public class Solution { public boolean isSymmetric(TreeNode root) { if(root== null) return true; return ifSymmetric(root.left, root.right); } public boolean ifSymmetric(TreeNode tree1, TreeNode tree2) { if(tree1==null && tree2==null) return true; else if(tree1 == null || tree2 == null) return false; if(tree1.val != tree2.val) return false; else return (ifSymmetric(tree1.left, tree2.right) && ifSymmetric(tree1.right, tree2.left)); } }
时间: 2024-11-04 22:35:19