剑指offer编程题
Dev-Y
一只蚂蚁
展开
-
剑指offer--重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解析:已知树的先序遍历和中序遍历,需要我们重建这个二叉树,其实大家都知道三种顺序遍历,我们只用只要其中两个就可以重建这个二叉树了.拿到这道题先分析一下,不用代码原创 2017-05-04 16:02:51 · 237 阅读 · 0 评论 -
剑指Offer--二叉搜索树的后续遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解析:二叉搜索树又叫二叉排序树。它的特点是,根节点左边的节点都小于根节点,根节点右边的节点都大于根节点,所以的子节点也遵循这个规律。知道这些,在解这道题目的时候,首先自己写一个二叉搜索树,将它的后续遍历序列写出来。会发现最后一个元素是根节点,而根节点会将前面原创 2017-05-12 22:16:27 · 319 阅读 · 0 评论 -
剑指Offer--层序遍历二叉树
题目:层序遍历二叉树,即从上往下打印二叉树,每层从左往右;解析:这道题目并不难,只是比较常用的一个问题,因为树形结构的多种遍历方法,我想以后会有很多使用的机会,所以借此收藏一下。以下的实现方法也是最常用的一种,就是用一个队列来存储每一层的节点,然后输出,完成层序遍历。因为队列的特点是先进先出,所以父节点会比子节点先进队列,也好久先输出父节点import java.util.*;/**public原创 2017-05-12 22:06:40 · 359 阅读 · 0 评论 -
剑指Offer--栈的压人与弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 解析:这道题目主要采取的是模拟的思想来解决的。即通过创建一个栈,根据压入序列来压入数据,根据弹出原创 2017-05-12 21:59:18 · 226 阅读 · 0 评论 -
剑指Offer --树的子结构
题目:输入两个二叉树A,B判断B是不是A的子结构。解析:针对树这种数据结构的题目,大多数都是根据树的遍历为基础来展开的。这道题目 也是这样的一个套路。从根节点开始判断,如果A树的根节点和B树相同,再比较左右子节点,再以左右子节点为根节点进行递归,如果最终达到B的叶子节点,都没有不同的节点,则B是A的子结构。如果发现有不同节点,则回到A树,遍历到下一个节点,继续比较。代母实现如下。/**publi原创 2017-05-12 21:46:33 · 220 阅读 · 0 评论 -
剑指offer-- 反转链表
题目:反转链表,输入一个链表,输入该链表的反转解析:这道题没有什么思想,就是最基本的链表运算,但是牵扯了很多指针的变换,所以,经常拿出来考,大家熟记就好了/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/p原创 2017-05-04 17:25:44 · 286 阅读 · 0 评论 -
剑指offer--链表倒数第K个节点
题目:输入一个链表,输出该链表中倒数第k个结点。解析:最原始的想法就是先遍历一遍得到这个链表的长度,然后第二次遍历得到第K个节点的.第二种方法的思想很巧妙可以只遍历一次就可以.设置两个指针,先让尾指针向后移动k-1个单位,然后两个指针同时移动,直到尾指针到链表的最后一个节点,那么头指针就指向的是第K个节点./*public class ListNode { int val; Lis原创 2017-05-04 17:18:29 · 182 阅读 · 0 评论 -
剑指offer--DP类题目汇总
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39.解析:斐波那契数列就是前两个数的和等于第三个数,一个典型的递归思想的数列,所以这道题也是用递归的思想来解决.但是只是递归的话,会产生很多的冗余,因为递归会把每种情况算很多遍,比如算n=5的时候,会把前面n=4.3.2.1所有的情况算一遍得到n=5,而在算n=4的时候,也会计算n=1.2.3的情况这样产生了原创 2017-05-04 17:01:57 · 332 阅读 · 0 评论 -
剑指offer--旋转数组中的最小数
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解析:这道题我最开始的思路是直接从前往后遍历,找到后一个数字小于前一个数字.这个数字就是最小的那个数字.通过后发原创 2017-05-04 16:28:17 · 261 阅读 · 0 评论 -
剑指offer--两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解析:栈和队列的弹出序列是相反的这个两个数据结构的性质有关,一个是先进先出,一个是先进后出.所以如果用两个栈,相当于把数据的顺序倒了两次最后使得起顺序和队列一样,这是原理很简单,但是如何实现呢,这里需要注意的点有两个: 1. 弹出栈不为空不能向里面压入数据 2. 压入栈必须每次将所有的数据都压入弹出栈i原创 2017-05-04 16:13:14 · 198 阅读 · 0 评论 -
全排列算法
一.递归法问题:全排列问题及给出一个序列如{a,b,c}输出它的全排列,一共有3!=6种排法.及一个n个元素的序列全排列有n!个排列方法.那么如何得到每种排列呢?解析:首先拿到一个题目先用数学的思想去考虑怎么解决.我们在纸上模拟这道题目的过程,其实就是我们算法实现的过程,只不过需要我们通过程序代码使其形成一种闭环的操作,让它自己迭代得到最终的结果.全排列问题是递归的一种典型问题.举个例子{1,2,3原创 2017-05-08 15:57:26 · 418 阅读 · 1 评论