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

源码:

 /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null)
return true;
else if(!(p != null && q != null))
return false;
else {
if(p.val == q.val)
return(isSameTree(p.left, q.left) && isSameTree(p.right, q.right));
else
return false;
}
}
}

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

说明:

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

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

 /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null)
return true;
else
return isMirror(root.left, root.right);
}
public boolean isMirror(TreeNode m, TreeNode n) {
if(m == null & n == null)
return true;
else if(m !=null && n !=null && m.val == n.val)
return (isMirror(m.left, n.right) && isMirror(m.right, n.left));
else
return false;
}
}

执行用时 : 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。

 /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null)
return true;
List<TreeNode> l1 = new ArrayList<TreeNode>();
List<TreeNode> l2 = new ArrayList<TreeNode>();
l1.add(root.left);
l2.add(root.right);
int cur1 = 0;
int cur2 = 0;
while(cur1 < l1.size() && cur2 < l2.size()) {
if(l1.get(cur1) == null && l2.get(cur2) == null) {
cur1++;
cur2++;
continue;
}
else if(l1.get(cur1) == null || l2.get(cur2) == null)
return false;
else if(l1.get(cur1).val == l2.get(cur2).val) {
l1.add(l1.get(cur1).left);
l1.add(l1.get(cur1++).right);
l2.add(l2.get(cur2).right);
l2.add(l2.get(cur2++).left);
}
else
return false;
}
return true;
}
}

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

LeetCode 100 及 101题的更多相关文章

  1. [LeetCode] 接雨水,题 Trapping Rain Water

    这题放上来是因为自己第一回见到这种题,觉得它好玩儿 =) Trapping Rain Water Given n non-negative integers representing an eleva ...

  2. AI面试必备/深度学习100问1-50题答案解析

    AI面试必备/深度学习100问1-50题答案解析 2018年09月04日 15:42:07 刀客123 阅读数 2020更多 分类专栏: 机器学习   转载:https://blog.csdn.net ...

  3. LeetCode Top 100 Liked 点赞最高的 100 道算法题

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:刷题顺序,刷题路径,好题,top100,怎么刷题,Leet ...

  4. leetcode 100. Same Tree、101. Symmetric Tree

    100. Same Tree class Solution { public: bool isSameTree(TreeNode* p, TreeNode* q) { if(p == NULL &am ...

  5. Leetcode 记录(101~200)

    Now, I want to just use English to explain the problem, it's about two month before the interview, s ...

  6. 每日温度(LeetCode Medium难度算法题)题解

    LeetCode 题号739中等难度 每日温度 题目描述: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 ...

  7. Leetcode按Tag刷题

    按照Leetcode的Tag来刷题,从easy到hard刷题 关于如何让Leetcode按难易程度排序,可按以下步骤: 1. 进入Leetcode后,点击code 2.点击code后,可查看所有题目, ...

  8. LeetCode第十二题-将数字转化为罗马数字

    Integer to Roman 问题简介:将输入的int类型数字转化为罗马数字 问题详解:罗马数字由七个不同的符号表示:I,V,X,L,C,D和M 符号-数值 I - 1 V - 5 X -10 L ...

  9. 将100道计算题输出至txt文件,再读取文件至控制台,在控制台中输入答案并评判对错

    我在课堂上基本完成了输出100道题和创建文档,但是因为对输入输出流不熟悉,所以并没有实现将输出的计算题导出到文档里,在课下我又请教了宿舍的大佬,基本完成如下: 源代码: import java.io. ...

随机推荐

  1. LiveCD、LiveDVD和BinDVD区别在哪里

    本文转载自: http://www.kankanews.com/ICkengine/archives/86968.shtml 1.CentOS系统镜像有两个,安装系统只用到第一个镜像即CentOS-6 ...

  2. atexit函数详解

    对C语言有所了解的人都知道main函数是整个程序的入口,但是其实不然,在内核中可以使用链接器来设置程序的开始地方.当内核使⽤⼀个exec函数执⾏C程序时,在调⽤main函数之前先调⽤⼀个特殊的启动例程 ...

  3. bzoj 1014 [JSOI2008]火星人prefix——splay+哈希

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1014 用splay维护字符串,每个点记录子树的哈希值,然后二分查询. 二分不是把两个点的哈希 ...

  4. poj 2420 A Star not a Tree? —— 模拟退火

    题目:http://poj.org/problem?id=2420 给出 n 个点的坐标,求费马点: 上模拟退火. 代码如下: #include<iostream> #include< ...

  5. poj2226Muddy Fields——二分图匹配

    题目:http://poj.org/problem?id=2226 把行连通块作为左部点,列连通块作为右部点,行列连通块有相交的格子就连边: 则问题转化为求最小点覆盖,即最大匹配. 代码如下: #in ...

  6. 二、mysql安装详解

    step1:打开下载的mysql安装文件(mysql-5.5.36-win32.msi),双击运行,如下图: step2:点击“Next”按钮继续,如下图: step3:点击“勾选”,点击“Next” ...

  7. getElementsByName()获取标签时的注意

    var aDiv = document.getElementsByTagName('div');//获取的标签名注意你下面用的是哪一个div的标签名,例如 aDiv[0] 才可以: <!-- 注 ...

  8. Fuzzy Search

    题意: 考虑模板串B和给定串A,给定K,对于模板串上给定位置j的字符,如果能在给定串上i左右K个字符内找到相同字符,则说可以匹配. 问有多少匹配. 解法: 考虑对于每一种字符分开求. 对于当前字符ch ...

  9. 深入Mybatis配置文件

    Configuration是干嘛的 Configuration就像是Mybatis的总管,Mybatis的所有配置信息都存放在这里,此外,它还提供了设置这些配置信息的方法.Configuration可 ...

  10. 【Data Structure & Algorithm】二叉树中和为某值的所有路径

    二叉树中和为某值的所有路径 题目:输入一个整数和一个二叉树,从树的根节点开始往下访问一直到叶节点所经过的所有节点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数22和如下二叉树: 10 ...