标签:style blog color ar 使用 for sp div on
算法能力一直不好,决定利用晚上和假期时间多做点算法题,动动手,提高自己。大家看到我的水平低还望莫要嘲笑,嘻嘻。
这一题呢是LeetCode上的对称树问题,
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
一开始没能够全面的思考树的情况,单纯理解为对称树即对称的完全二叉树,于是首先想到的就是直接对树进行层次遍历,对每一层进行对称性检验。结果提交时发现,其实如下图这种树也是对称的
1 / 2 2 / 3 3
后来思考能否通过树的中序遍历来判断是否对称,但结果也是不可以的。如下图这棵树:
1 / 2 3 / / 3 2
只能换一种思路啦,对于对称树某一层上的两个相对称节点来说,节点A的左子树与B的右子树对称,节点A的右子树与B的左子树对称。所以可以直接使用递归算法,初始为(root,root)对,然后根据前面的规律递归。
public static boolean isSymmetric(TreeNode root) { return isSys(root,root); } public static boolean isSys(TreeNode l,TreeNode r){ if(l==null && r==null) return true; if(l==null || r==null) return false; if(l.val!=r.val) return false; boolean left = isSys(l.left , r.right); boolean right = isSys(l.right,r.left); return left&&right; }
若不用递归的方法,则可以设置两个队列,push左右子树的节点进行比较。(一个队列先左后右,另一个先右后左)
public static boolean isSymmetric1(TreeNode root){ if(root==null)return true; Queue<TreeNode> lt = new LinkedList<TreeNode>(); Queue<TreeNode> rt = new LinkedList<TreeNode>(); if(root.left!=null) lt.add(root.left); if(root.right!=null) rt.add(root.right); TreeNode l; TreeNode r; while(!lt.isEmpty() && !rt.isEmpty()) { l = lt.poll(); r = rt.poll(); if(l == null && r == null) continue; if(l == null || r == null) return false; if(l.val != r.val) return false; lt.add(l.left); lt.add(l.right); rt.add(r.right); rt.add(r.left); } if(lt.isEmpty() && rt.isEmpty()) return true; else return false; }
标签:style blog color ar 使用 for sp div on
原文地址:http://www.cnblogs.com/kunshao/p/4069945.html