迁安做网站中的cms润强,百万网址导航,企业精髓八个字,google永久免费服务器101. 对称二叉树
难度#xff1a;简单
题目
给你一个二叉树的根节点 root #xff0c; 检查它是否轴对称。
示例 1#xff1a; 输入#xff1a;root [1,2,2,3,4,4,3]
输出#xff1a;true示例 2#xff1a; 输入#xff1a;root [1,2,2,null,3,null,3]
输出#…101. 对称二叉树
难度简单
题目
给你一个二叉树的根节点 root 检查它是否轴对称。
示例 1 输入root [1,2,2,3,4,4,3]
输出true示例 2 输入root [1,2,2,null,3,null,3]
输出false提示
树中节点数目在范围 [1, 1000] 内-100 Node.val 100
**进阶**你可以运用递归和迭代两种方法解决这个问题吗
个人题解
方法一递归-深度优先遍历
写了 100 题后再写这题信手捏来。先判断当前节点是否为空。再判断当前节点的左节点和右节点是否相等。再看左左节点与右右节点再比较左右节点与右左节点。
/*** 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 process(root.left, root.right);}public boolean process(TreeNode left, TreeNode right) {if (left null right null) {return true;}if (left null ^ right null) {return false;}if (left.val ! right.val) {return false;}if (!process(left.left, right.right)) {return false;}return process(left.right, right.left);}
}官方题解
方法一递归
如果一个树的左子树与右子树镜像对称那么这个树是对称的。因此该问题可以转化为两个树在什么情况下互为镜像
如果同时满足下面的条件两个树互为镜像
它们的两个根结点具有相同的值每个树的右子树都与另一个树的左子树镜像对称
我们可以实现这样一个递归函数通过「同步移动」两个指针的方法来遍历这棵树p 指针和 q 指针一开始都指向这棵树的根随后 p 右移时q 左移p 左移时q 右移。每次检查当前 p 和 q 节点的值是否相等如果相等再判断左右子树是否对称。
class Solution {public boolean isSymmetric(TreeNode root) {return check(root, root);}public 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) {return check(root, root);}public boolean check(TreeNode u, TreeNode v) {QueueTreeNode q new LinkedListTreeNode();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;}
}复杂度分析
时间复杂度O(n)空间复杂度O(n)
作者力扣官方题解 链接https://leetcode.cn/problems/symmetric-tree/solutions/268109/dui-cheng-er-cha-shu-by-leetcode-solution/ 来源力扣LeetCode 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。