加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

[置顶] 【LeetCode】101. Symmetric Tree 解题报告

发布时间:2020-12-13 21:08:48 所属栏目:PHP教程 来源:网络整理
导读:转载请注明出处:http://blog.csdn.net/crazy1235/article/details/51541984 Subject 出处: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,th

转载请注明出处:http://blog.csdn.net/crazy1235/article/details/51541984


Subject

出处: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

Explain

判断1颗2叉树是不是 镜像对称


Solution

solution 1

判断是不是是镜像对称,重要的就是判断对应位置的两个结点的值是不是相等。

方法1使用双端队列来实现。

/** * 双端队列 <br /> * DFS <br /> * 3ms <br /> * beats 6.29% of java submissions * * @param root * @return */ public boolean isSymmetric(TreeNode root) { if (root == null) { return true; } Deque<TreeNode> deque = new LinkedList<TreeNode>(); deque.addFirst(root.left); deque.addLast(root.right); TreeNode preNode = null; TreeNode postNode = null; while (!deque.isEmpty()) { preNode = deque.pollFirst(); postNode = deque.pollLast(); if (preNode == null && postNode == null) { continue; } if (preNode == null || postNode == null) { return false; } if (preNode.val != postNode.val) { return false; } else { deque.addFirst(preNode.right); deque.addFirst(preNode.left); deque.addLast(postNode.left); deque.addLast(postNode.right); } } return true; }

每次都是从队头和队尾各poll出结点,然落后行比较。

如果条件满足,将队头结点的右结点和左结点入队头
队尾结点的左结点和右结点入队尾
直到队列为空


solution 2

递归方式

/** * 递归方式 <br /> * 1ms <br /> * * @param root * @return */ public boolean isSysmmetric2(TreeNode root) { if (root == null) { return true; } return checkNodes(root.left,root.right); } public boolean checkNodes(TreeNode node1,TreeNode node2) { if (node1 == null && node2 == null) { return true; } if (node1 == null || node2 == null) { return false; } if (node1.val != node2.val) { return false; } else { return checkNodes(node1.left,node2.right) && checkNodes(node1.right,node2.left); } }

该方法的效力较高~
1ms


solution 3

斟酌到之前有做过1个【Same Tree】 的题目和 【Reverse Binary Tree】 的题目。
所以想到,将当前2叉树“反转”,然后在判断这两个树是不是1样便可。

/** * 拷贝1颗2叉树,reverse。或拷贝的时候直接反转。 <br /> * 然后在使用Same Tree的方法判断这两个树是不是1样。 <br /> * 1ms * * @param root * @return */ public boolean isSysmmetric3(TreeNode root) { if (root == null) { return true; } TreeNode newRootNode = copyNode(root); SameTree sameTree = new SameTree(); return sameTree.isSameTree(root,newRootNode); } /** * 左右对换结点拷贝2叉树 * * @param node * @return */ private TreeNode copyNode(TreeNode node) { if (node == null) { return null; } TreeNode treeNode = new TreeNode(node.val); treeNode.left = copyNode(node.right); treeNode.right = copyNode(node.left); return treeNode; }

传送门

【Same Tree】

【Reverse Binary Tree】


bingo~~

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读