前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 100 及 101题

LeetCode 100 及 101题

作者头像
Carlos Ouyang
发布2019-08-19 17:14:08
3950
发布2019-08-19 17:14:08
举报
文章被收录于专栏:Java 学习日记

100. 相同的树

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入: 1 1

/ \ / \

2 3 2 3

[1,2,3], [1,2,3]

输出: true

示例 2:

输入: 1 1 / \ 2 2 [1,2], [1,null,2] 输出: false

示例 3:

输入: 1 1

/ \ / \

2 1 1 2

[1,2,1], [1,1,2]

输出: false

源码:

代码语言:javascript
复制
 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public boolean isSameTree(TreeNode p, TreeNode q) {
12         if(p == null && q == null)
13             return true;
14         else if(!(p != null && q != null))
15             return false;
16         else {
17             if(p.val == q.val)
18                 return(isSameTree(p.left, q.left) && isSameTree(p.right, q.right));
19             else
20                 return false;
21         }      
22     }
23 }

这道题我的解题思路是通过递归遍历这两个树。当两个树当前的节点对应的值相等时,调用自己的方法判断当前节点的左右两个子树是不是也是相同的树,递归终止的条件就是:如果两个树的当前节点都为空,返回true;一个树为空一个不为空,返回false;当前节点的值不相同,也返回false。

101. 对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

1

/ \

2 2

/ \ / \

3 4 4 3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

1

/ \

2 2

\ \

3 3

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

这道题一看到,我就联想到了上面一题,我们只要从根节点处分开两个子树,同样用递归的方法判断两个子树是不是“相等”,这里只需要把在调用自身方法时的参数改成 “左等于右”&&”右等于左“ 即可,代码如下:

代码语言:javascript
复制
 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public boolean isSymmetric(TreeNode root) {
12         if(root == null)
13             return true;
14         else
15             return isMirror(root.left, root.right);
16     }
17     public boolean isMirror(TreeNode m, TreeNode n) {
18         if(m == null & n == null)
19             return true;
20         else if(m !=null && n !=null && m.val == n.val)
21             return (isMirror(m.left, n.right) && isMirror(m.right, n.left));
22         else 
23             return false; 
24     }
25 }

执行用时 : 1 ms, 在Symmetric Tree的Java提交中击败了99.59% 的用户 内存消耗 : 34.8 MB, 在Symmetric Tree的Java提交中击败了85.06% 的用户

按照题目要求,还可以用循环的方法做这道题。我的思路是,设定两个 List,分别代表从根节点分开的左边的树和右边的树,在设定两个 int 类型变量作为 List 的光标(index),将两个子树的头加入 List 中。循环体中:当两个树对应节点处的值相等,则将左边树的左、右子节点依次加入 List1,对应的将右边树的右、左子节点;依次加入 List2,然后两个光标自加;若对应节点都为空,则光标自加,然后 continue 继续下一次循环;若只有一个为空,返回 false;其他情况也返回 false。循环的终止条件是,光标的值不小于 List 的长度了,也就是任意一个 List 的每个元素已经循环完了。若循环结束,最后此方法返回 true。

代码语言:javascript
复制
 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public boolean isSymmetric(TreeNode root) {
12         if (root == null)
13             return true;
14         List<TreeNode> l1 = new ArrayList<TreeNode>();
15         List<TreeNode> l2 = new ArrayList<TreeNode>();
16         l1.add(root.left);
17         l2.add(root.right);
18         int cur1 = 0;
19         int cur2 = 0;
20         while(cur1 < l1.size() && cur2 < l2.size()) {
21             if(l1.get(cur1) == null && l2.get(cur2) == null) {
22                 cur1++;
23                 cur2++;
24                 continue;
25             }
26             else if(l1.get(cur1) == null || l2.get(cur2) == null)
27                 return false;
28             else if(l1.get(cur1).val == l2.get(cur2).val) {
29                 l1.add(l1.get(cur1).left);
30                 l1.add(l1.get(cur1++).right);
31                 l2.add(l2.get(cur2).right);
32                 l2.add(l2.get(cur2++).left);
33             }
34             else
35                 return false;
36         }
37         return true;
38     }
39 }

执行用时 : 3 ms, 在Symmetric Tree的Java提交中击败了64.39% 的用户 内存消耗 : 34.6 MB, 在Symmetric Tree的Java提交中击败了88.39% 的用户

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 100. 相同的树
  • 101. 对称二叉树
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档