今日题目:

  1. 反转链表
  2. 合并两个排序的链表
  3. 树的子结构
  4. 二叉树的镜像
  5. 对称二叉树

今日重点是1反转链表,3树的子结构,以及5对称二叉树。

1. 反转链表

题目描述:
输入一个链表,反转链表后,输出链表的所有元素。 思路: 这道题可以有递归和迭代两种实现方法,较为经典,其中迭代又有头插和非头插两种方法。

代码如下:

 //递归实现
public ListNode ReverseList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode newNode = ReverseList(head.next);
head.next.next = head;
head.next = null;
return newNode;
} //迭代实现
//非头插法
public ListNode ReverseList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode pre = head;
ListNode cur = head.next;
ListNode next = cur.next;
while(cur != null){
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
head.next = null;
return pre;
} //头插法
public ListNode ReverseList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode dummy = new ListNode(0);
ListNode cur = head;
while(cur != null){
ListNode tmp = cur.next;
cur.next = dummy.next;
dummy.next = cur;
cur = tmp;
}
return dummy.next;
}

3. 树的子结构

题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 思路: 这道题其实不难,利用树的遍历就能够解决,但是要写得漂亮很难,下面贴出漂亮和不漂亮的写法。

代码如下:

漂亮的

     public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean result = false;
if(root1 != null && root2 != null){
result = isSubtree(root1,root2);
if(!result)
result = HasSubtree(root1.left,root2);
if(!result)
result = HasSubtree(root1.right,root2);
}
return result;
} public boolean isSubtree(TreeNode root1,TreeNode root2){
if(root2 == null)
return true;
if(root1 == null)
return false;
if(root1.val != root2.val)
return false;
return isSubtree(root1.left,root2.left)&&
isSubtree(root1.right,root2.right);
}

不漂亮的。。

     public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 == null)
return false;
if(isSubtree(root1,root2))
return true;
else{
boolean left = false, right = false;
left = HasSubtree(root1.left,root2);
right = HasSubtree(root1.right,root2);
return left || right;
}
} public boolean isSubtree(TreeNode root1,TreeNode root2){
if(root1 == null && root2 == null)
return true;
if(root1 == null)
return false;
if(root2 == null)
return true;
if(root1.val != root2.val)
return false;
return isSubtree(root1.left,root2.left)&&
isSubtree(root1.right,root2.right);
}

5. 对称二叉树

题目描述:
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 思路:递归实现,注意递归的节点顺序。

代码如下:

     boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot == null) return true;
return isSym(pRoot.left,pRoot.right);
} boolean isSym(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;
return isSym(left.left,right.right) &&
isSym(left.right,right.left);
}

《剑指offer》算法题第五天的更多相关文章

  1. 剑指offer算法题

    数组中只出现一次的数字(一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字): 解法在于位运算中的异或,直接异或可以得到这两个数的异或,按照最后的有效数字位可以 ...

  2. 剑指Offer(二十五):复杂链表的复制

    剑指Offer(二十五):复杂链表的复制 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...

  3. 剑指Offer(三十五):数组中的逆序对

    剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...

  4. 剑指offer算法总结

    剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行 ...

  5. 剑指Offer——算法复杂度中的O(logN)底数是多少

    剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...

  6. 剑指 offer 第一题: 二维数组中的查找

    打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣

  7. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  8. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  9. 剑指offer编程题66道题 36-66

    36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...

  10. 牛客网剑指offer刷题总结

    二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...

随机推荐

  1. 一次生产的JVM优化

    背景 生产环境有二台阿里云服务器,均为同一时期购买的,CPU.内存.硬盘等配置相同.具体配置如下: 节点 CPU 内存 硬盘 其它 A 2CPU 4G 普通云盘 Centos6.4 64位+JDK1. ...

  2. 使用tqdm实现下载文件进度条

    1.获取下载链接 下载链接为:http://fastsoft.onlinedown.net/down/Fcloudmusicsetup2.5.5.197764.exe 2.使用tqdm实现 2.1.从 ...

  3. id和class的区别

    id和class是定义css样式用到的,不同的是定义样式时的写法不一样,使用id选择样式时,定义的格式为 #main{width:20px;} ,使用class时用到的是 .main{width:20 ...

  4. 超链接hover切换效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <meta na ...

  5. unity 3D循环滚动效果

    https://blog.csdn.net/qinyuanpei/article/details/52765356 https://blog.csdn.net/chongzi_daima/articl ...

  6. JS基础_对象的简介、对象的基本操作

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. xpath下载

    1.下载地址,版本号为 2.0.2: 链接: https://pan.baidu.com/s/1GXPm1kMENXhOkefKcEQnlA 密码: 8wwv 2.安装 1).在chrome右上角找到 ...

  8. vue项目 时间戳转 格式

    项目用了 element UI的日期插件,修改时 时间回显不了,打印出来是换行了,因此要转换 changeTime(value){ let date = new Date(value); let y ...

  9. css and canvas实现圆形进度条

    进度条效果:   话不多说,上代码 使用css动画实现,看到一篇博客的启发,稍微修改了下, css实现的原理是用两个半圆一开始隐藏,再分别旋转180度,最后成为一个整圆 半圆效果,一开始右边的半圆在盒 ...

  10. Linux下MySql基本操作命令

    (1).切换至MySql目录下[假设MySql安装路径为:/home/mysql/bin] cd /home/mysql/bin (2).连接MySql mysql -u用户名 -p,回车后输入密码 ...