非商业,LeetCode连接附上:java
https://leetcode-cn.com/problems/symmetric-tree/this
进入正题。spa
题目:.net
给定一个二叉树,检查它是不是镜像对称的。code
示例:blog
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。递归
1 / \ 2 2 / \ / \ 3 4 4 3
可是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:leetcode
1 / \ 2 2 \ \ 3 3
进阶:get
你能够运用递归和迭代两种方法解决这个问题吗?同步
代码实现:
//节点 class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } } //方法一 递归 class Solution { public boolean isSymmetric(TreeNode root) { return check(root, root); } private boolean check(TreeNode p, TreeNode q) { if(p == null && q == null) { return true; } if(p == null || q == null) { return false; } return p.val == q.val && check(p.left, q.right) && check(p.right, q.left); } } //时间复杂度O(n),空间复杂度O(n) //方法二 迭代 class Solution { public boolean isSymmetric(TreeNode root) { if(root == null) { return true; } return check(root.left, root.right); } private boolean check(TreeNode p, TreeNode q) { Queue<TreeNode> queue = new LinkedList<>(); queue.offer(p); queue.offer(q); while (!queue.isEmpty()) { p = queue.poll(); q = queue.poll(); if(p == null && q == null) { continue; } if((p == null) || (q == null) || (p.val != q.val)) { return false; } queue.offer(p.left); queue.offer(q.right); queue.offer(p.right); queue.offer(q.left); } return true; } } //时间复杂度O(n),空间复杂度O(n)
分析:
题目中针对“对称二叉树”,要先找出“对称二叉树”的特色;
针对对称二叉树的特色进行递归的终止条件设置以及迭代时节点的存取及比较方式。
--End
本文同步分享在 博客"黑冰台"(CNBlog)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。