剑指 Offer 28. 对称的二叉树(101. 对称二叉树)
题目:
思路:
【1】递归便是最简单的处理方法,首先头结点是要不等于null就可以了,然后将两个节点当做新的头结点进行判断。
【2】迭代的方式(相当于利用循环替代递归)
代码展示:
迭代的方式:
//时间1 ms击败21.98% //内存40.9 MB击败5% //时间复杂度:O(n)。 //空间复杂度:这里需要用一个队列来维护节点,每个节点最多进队一次,出队一次,队列中最多不会超过 n 个点,故渐进空间复杂度为 O(n)。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public boolean isSymmetric(TreeNode root) { return check(root, root); } public boolean check(TreeNode u, TreeNode v) { Queue<TreeNode> q = new LinkedList<TreeNode>(); q.offer(u); q.offer(v); while (!q.isEmpty()) { u = q.poll(); v = q.poll(); if (u == null && v == null) { continue; } if ((u == null || v == null) || (u.val != v.val)) { return false; } q.offer(u.left); q.offer(v.right); q.offer(u.right); q.offer(v.left); } return true; } }
使用递归的方法:
//时间0 ms击败100% //内存39.5 MB击败88.29% //时间复杂度:这里遍历了这棵树,渐进时间复杂度为 O(n)。 //空间复杂度:这里的空间复杂度和递归使用的栈空间有关,这里递归层数不超过 n,故渐进空间复杂度为 O(n)。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public boolean isSymmetric(TreeNode root) { if(root == null) return true; return isSame(root.left,root.right); } public boolean isSame(TreeNode left,TreeNode right){ if (left == null || right == null) return (left == null && right == null); if (left.val != right.val) return false; return isSame(left.left,right.right) && isSame(left.right,right.left); } }