剑指Offer
bryant-xw
Stay hungry, Stay foolish
展开
-
【剑指Offer】树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解法:(1)树的遍历递归的到母树上面匹配子树的结构,存在即true,否则是false。第1步:比较根节点,如果根节点的值不相同,则必然是false。第2步:去遍历左子树和右子树注意:边界条件,如果子树为空的时候递归结束。同时要注意检验非法输入:pRoot1 = NULLCod...原创 2019-07-24 00:56:56 · 162 阅读 · 0 评论 -
【剑指Offer】对称的二叉树
1.题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。2.Code如果是/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x):val(x), left(NULL...原创 2019-08-05 21:12:43 · 68 阅读 · 0 评论 -
【剑指Offer】按之字形顺序打印二叉树
1.题目请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。2.Code按照“之”打印,就是成语“顶针续麻”或蛇头咬蛇尾的那种意思(例子不是很恰当,为了便于理解而已)~~~用下面这棵树举例,结果就是[1,3,2,4,5,6,7,15,14,13,12,11,10,9,8]牛客的测试是将每一层都放到...原创 2019-08-05 22:16:59 · 89 阅读 · 0 评论 -
【剑指Offer】二叉树中和为某一值的路径
1.题目:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)2.解析:要求输出所有的路径和情况,所以返回的结果是一个vector<vector<int>>,既然是从根节点打印到叶子节点,相当于先序遍历每个节点,(结束的...原创 2019-07-28 16:51:09 · 100 阅读 · 0 评论 -
【剑指Offer】二叉搜索树与双向链表
1.题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。2.解析方法1:递归给定的是一棵BST,中序遍历的结果就是一个有序序列,所以只要将给定的节点递归的连接到链表的尾部,一定要处理好左右指针和最后将指针回溯到头节点才可以返回双向链表Code/*struct TreeNode { int val; s...原创 2019-07-28 19:00:43 · 86 阅读 · 0 评论 -
【剑指Offer】二叉搜索树的后序遍历序列
1.题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。2.Code后序遍历数组,则最后一个数是树的根节点,又因为是一棵BST,则比这个数小的都是左子树,比其大的都是个右子树上的节点。所以递归解决即可。注意数组为空的状态和边界条件的检查class Solution {public: bo...原创 2019-08-02 08:29:45 · 80 阅读 · 0 评论 -
【剑指Offer】二维数组中的查找
1.题目在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。2.Code是一个有序的数组,从左到右,从上到下升序,选取右上角或者左下角则可以每次依据判断大小剪掉一部分。当然也可以2层循环遍历一遍二维数组。class Solution {public...原创 2019-08-08 22:20:24 · 95 阅读 · 0 评论 -
【剑指Offer】旋转数组的最小数字
1.题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。2.Code二分:具体看代码很好理解。注意一点,当arr[left]、arr[right]、arr[mid]都...原创 2019-08-08 23:14:40 · 84 阅读 · 0 评论 -
【剑指Offer】调整数组顺序使奇数位于偶数前面
1.题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。2.Code注意:牛客上的这道题要比剑指上面的多了一个限制条件:保证奇偶的各自的相对位置不发生变化,这就意味着:不借助额外空间是不可能做到的。剑指上的没有限制相对位置,所以只要保证奇数都在前面,偶数都在后面,原地调就...原创 2019-08-09 08:11:12 · 117 阅读 · 0 评论 -
【剑指Offer】把二叉树打印成多行
1.题目从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。2.Code(1)解法1:继承上1个题的思路这个题和“之”字形打印的思路一样的,只不过是顺序都保持了一致(先进先出),则可以将stack换做queue/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *r...原创 2019-08-06 21:57:59 · 210 阅读 · 0 评论 -
【剑指Offer】序列化二叉树
1.题目请实现两个函数,分别用来序列化和反序列化二叉树2.Code用特定的符号将各个节点独立出来,最后按照这个顺序重建二叉树即可,注意一些边界条件。class Solution {public: string Tree_to_string(TreeNode* root){ if(!root){ return "#"; ...原创 2019-08-06 23:42:19 · 99 阅读 · 0 评论 -
【剑指Offer】数组中出现次数超过一半的数字
1.题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。2.Code...原创 2019-08-11 21:03:24 · 107 阅读 · 0 评论 -
【剑指Offer】求1+2+3+...+n
1.题目求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。2.Code前n项和公式:n*(n+1)/2 = (n^2 + n )/ 2class Solution {public: int Sum_Solution(int n) { return (int)(pow(n,2)+...原创 2019-08-28 00:50:25 · 96 阅读 · 0 评论 -
【剑指Offer】二叉树的镜像
1.题目操作给定的二叉树,将其变换为源二叉树的镜像。2.解析所谓镜像,即和原来的树左右对称利用三变量交换法来交换左右子树即可从根节点开始交换,然后判断其左右子树是否存在,存在就递归调用贴个图便于理解Code/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *righ...原创 2019-07-28 10:59:43 · 113 阅读 · 0 评论 -
【剑指Offer】链表中环的入口结点
1.题目给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。2.Code之前写过这个题目的题解及证明,链接在这:链表环入口/*struct ListNode { int val; struct ListNode *next; ListNode(int x):val(x), next(NULL) { }};*/class Sol...原创 2019-07-28 10:25:48 · 85 阅读 · 0 评论 -
【剑指Offer】复杂链表的复制
1.题目2.解法:(1)直接复制:先处理普通指针,再处理随机指针时间复杂度:O(n^2),额外空间复杂度:O(1)因为在确定clone链表的每个节点的random指针的时候都需要从头去遍历原链表Code/*struct RandomListNode { int label; struct RandomListNode *next, *random; Rand...原创 2019-07-28 02:24:21 · 94 阅读 · 0 评论 -
【剑指Offer】链表中倒数第K个节点
题目:输入一个链表,输出该链表中倒数第k个结点。解题笔记:踩坑:注意三种特殊的边界检测情况,都需要返回NULL(1)k的值要大于链表长度len(2)k < 1(3)头节点直接是NULLCode解法1:扫一趟链表记录长度len,倒数第k个数就是正数len-k+1个,所以只需要从给定的头节点再一次遍历len-k步就到了该节点/*struct ListNode...原创 2019-07-16 23:51:56 · 80 阅读 · 0 评论 -
【剑指Offer】合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。Code/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: List...原创 2019-07-17 00:03:23 · 71 阅读 · 0 评论 -
【剑指Offer】反转链表
输入一个链表,反转链表后,输出新链表的表头Code注意保存需要用到的节点后再断开,否则后续无法连接/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode*...原创 2019-07-17 00:15:24 · 80 阅读 · 0 评论 -
【剑指Offer】删除链表中重复的结点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5注意:是重复的节点一概不保留,所以要保存重复区域的前驱节点,同时注意将重复的区域一直遍历到最后,这样就跳过了整个重复区域Code/*struct Lis...原创 2019-07-17 23:43:41 · 66 阅读 · 0 评论 -
【剑指Offer】两个链表的第一个公共结点
题目输入两个链表,找出它们的第一个公共结点。code只考虑了两个无环链表的相交情况/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindFi...原创 2019-07-18 00:06:45 · 95 阅读 · 0 评论 -
【剑指Offer】从尾到头打印链表
1. 题目输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。2. Code将节点的值保存到栈stack中,最后从栈中弹出再保存到vector中递归的解法如果层数太多的时候会爆栈/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(in...原创 2019-07-25 08:17:09 · 73 阅读 · 0 评论 -
【剑指Offer】从上往下打印二叉树
1.题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。2.Code要求层序打印 ,就是广搜BFS,借助一个队列,题目要求返回的是一个vector数组,则将队列中弹出的元素push_back到数组中即可注意:一定要判断root为空的特殊样例,我开始的时候忽略了这个边界,导致了段错误/*struct TreeNode { int val; struct TreeNode *le...原创 2019-07-25 15:36:36 · 87 阅读 · 0 评论 -
【剑指Offer】二叉树的深度
1.题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。2.Code题意说:树的深度就是从根节点到最深的一个叶子节点的深度。比如只有根节点则深度就是1,则可以使用递归去判断左右子树一直到各自的最后一个叶子节点,然后取最大值再加上根节点的1即可/*struct TreeNode { int val; ...原创 2019-08-04 12:06:07 · 76 阅读 · 0 评论 -
【剑指Offer】平衡二叉树
1.题目输入一棵二叉树,判断该二叉树是否是平衡二叉树。2.Code一棵平衡二叉树就是这棵树中的以任何一个节点为根节点的树,其左右子树的高度差不超过1。所以上一个题求一棵二叉树的深度的方法就可以借鉴了啊。既然可以递归求取子树的高度,那么就可以比比二者的高度差,然后判断即可/*struct TreeNode { int val; struct TreeNode *left;...原创 2019-08-04 12:19:41 · 74 阅读 · 0 评论 -
【剑指Offer】二叉树的下一个结点
1.题目给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。2.Code中序遍历:左子树、根、右子树中序遍历的结果:4,2,8,5,9,1,6,3,7观察图片可以知道:节点2的下一节点是8,即右子树的最左节点节点9的下一节点是1,这个就比较麻烦了,它没有右子树,则只能通过指向父结点的指针回溯,同时判断是不...原创 2019-08-04 17:46:22 · 78 阅读 · 0 评论 -
【剑指Offer】重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。code解析:递归法求取树的root节点由于给定前序和中序,或者后序和中序就可以确定一棵二叉树的结构所以:先序情况下第一个节点必然是树的根节...原创 2019-07-22 23:07:21 · 73 阅读 · 0 评论 -
【剑指Offer】二叉搜索树的第k个结点
1.题目给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。2.Code二叉搜索树的中序遍历就是有序序列,定义一个计数器count每次中序遍历的时候+1,当等于k的时候结束/*struct TreeNode { int val; struct TreeNode *left; str...原创 2019-08-07 22:27:05 · 137 阅读 · 0 评论 -
【剑指Offer】不用加减乘除做加法
1.题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。2.Code借用位运算class Solution {public: int Add(int a, int b) { int tmp; while(b){ tmp = a^b; b = (a&b)&...原创 2019-08-28 01:27:12 · 112 阅读 · 0 评论