《剑指offer》算法题第五天
今日题目:
- 反转链表
- 合并两个排序的链表
- 树的子结构
- 二叉树的镜像
- 对称二叉树
今日重点是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》算法题第五天的更多相关文章
- 剑指offer算法题
数组中只出现一次的数字(一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字): 解法在于位运算中的异或,直接异或可以得到这两个数的异或,按照最后的有效数字位可以 ...
- 剑指Offer(二十五):复杂链表的复制
剑指Offer(二十五):复杂链表的复制 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...
- 剑指Offer(三十五):数组中的逆序对
剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...
- 剑指offer算法总结
剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行 ...
- 剑指Offer——算法复杂度中的O(logN)底数是多少
剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...
- 剑指 offer 第一题: 二维数组中的查找
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣
- 剑指Offer编程题2——替换空格
剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...
- 剑指Offer编程题1——二维数组中的查找
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...
- 剑指offer编程题66道题 36-66
36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...
- 牛客网剑指offer刷题总结
二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...
随机推荐
- c++11特性
0. 简介 在c++11标准中, 语言本身和标准库都增加了很多新内容. 里面的某些特性, 会让你在代码编写时更优雅. 我的环境: 系统: ubuntu16.04 g++版本: g++5.4.0 使用c ...
- Kefa and Dishes(CodeForces580D)【状态压缩DP】
状态压缩DP裸题,比赛的时候没反应过来,进行了n次枚举起点的solve,导致超时. #include<cstdio> #include<iostream> #include&l ...
- redis 主从、哨兵、集群
出处: redis主从复制和哨兵 Redis集群方式共有三种:主从模式,哨兵模式,cluster(集群)模式 一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步 ...
- 怎样创建并使用 vue 组件 (component) ?
组件化开发 需要使用到组件, 围绕组件, Vue 提供了一系列功能方法, 这里仅记录组件的 最简单 的使用方法. 1. 通过 Vue.component(tagName, options) 注册一个 ...
- C#面向对象13 文件类操作 Path/File/FileStream
1.path using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...
- jquery选择器 模糊查找
$("input[class^='combo-text']").attr("readonly", "readonly"); 查找包含‘com ...
- windows server12 FTP 创建后常见问题
一:用administrator 关闭防火墙可以访问,但是开启后不能访问 今天在windows server 2008 R2上安装了FTP,安装过程如下,然后添加内置防火墙设置,设置后发现本地可以访问 ...
- Vue生命周期及业务场景使用
vue里的生命周期是什么? vue实例从创建到销毁的过程称之为vue的生命周期 vue的生命周期各阶段都做了什么? beforeCreate 实例创建前:这个阶段实例的data.methods是读不到 ...
- 服务端相关知识学习(四)之Zookeeper启动过程
在上一篇,我们了解了zookeeper最基本的配置,也从中了解一些配置的作用,那么这篇文章中,我们将介绍Zookeeper的启动过程,我们在了解启动过程的时候还要回过头看看上一篇中各个配置参数在启动时 ...
- 抓包工具之tcpdump
tcpdump 官网 -> http://www.tcpdump.org 1. 安装步骤 在官网分别下载 Tcpdump.Libpcap 这两个包链接 在安装Tcpdump之前,先安装Libpc ...