题目: 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 思路: 很明显,采用广度优先遍历来解决,但因为需要按行输出,所以需要判断每一层的开始和结束,因此需要两个变量,一个表示当前层尚未打印的结点数,一个表示下一层结点的数目. 在线测试: http://www.nowcoder.com/books/coding-interviews/445c44d982d04483b04a54f298796288?rp=3 AC代码: /* struct TreeNode { int val;…
问题描述 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率. 示例 1: 输入: 1 输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667] 示例 2: 输入: 2 输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0…
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 二叉树结点的定义: struct TreeNode{ int val; TreeNode* left; TreeNode* right; }; 思路: 典型的回溯法问题,主要分为递归和剪枝两部分. 递归: 如果当前结点不为空,且结点的值小于期望值,则将该结点压入路径vector中,并继续从左右子结点往下遍历: if(root->left)   Fi…
题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路: 把矩阵想象成若干个圈,通过循环操作来打印矩阵,每次打印矩阵中的一个圈: 1.循环起始条件和结束条件: 起始条件:(1,1),(2,2)...(start,start) 结束条件:columns>start*2 &&a…
题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的定义如下: struct TreeNode{ int val; TreeNode* left; TreeNode* right; }; 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 思路: 观察上面两个二叉树,很容易就可以得出下面求一棵树镜像的过程: 先序遍历这棵树的每个结点,如果遍历到的结点有子结点,则交换它的两个子…
题目: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 思路: 根的深度=MAX(左子树深度,右子树深度)+1; Code: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution…
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路: dfs一下就可以了.一般dfs肯定递归写比较方便. 注意,递归的结束条件是遇到叶节点,而不是遇到空指针.(如果是遇到空指针,则叶节点相当于判断了两次,然而写出来的代码出现了段错误,不知道为什么) 相关:树求和(里面好像dfs用循环写的~) 代码: /* struct TreeNode { int val; struct TreeNode *…
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1     2  3   4 5    6   7   8 9   10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路: 这里没有使用书上的方法,而是维护一个二维坐标的最小最大值.假设横轴向左为x正方向,竖轴向下为y正方向,则依次从左到右.从上到下.从右到做.从下到上输出一个圈.能形成一个圈的条件是minx<…
题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 考虑中序遍历的过程, 如果当前结点存在右子节点,那么当前结点的下一个结点应该为该右子树的最左边的结点: 如果当前结点没有右子节点,那么如果当前结点的父结点p->parent为其父结点的父结点p->parent->patent的左子结点,那么当前结点的下一结点即为其父结点:否则继续往上遍历,直至找到一个结点为其父结点的左子结点,那么该结点即…
题目: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 结点的定义如下: struct TreeNode{ int val; TreeNode* left; TreeNode* right; }; 思路: 对于树的问题基本都可以通过递归来解决. 一棵二叉树的深度,等于它的左子树深度和右子树深度的较大者+1: 递归的结束条件就是:该结点为空,深度为0: 代码: struct TreeNode{ int val; TreeNo…
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值.链表节点定义如下: struct ListNode{ int m_nKey; ListNode* m_pNext; } 测试用例: 功能测试(输入的链表有多个节点:输入的链表只有一个节点). 特殊输入测试(输入的链表头结点指针为nullptr). 测试代码: void Test(ListNode* pHead) { PrintList(pHead); PrintListReversingly_Iteratively(pHead); p…
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5 3, 8, 6},则重建如下图所示的二叉树并输出它的头结点.二叉树的节点的定义如下: struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; /…
(由一个二叉树的前序和中序序列重建一颗二叉树) 书中方法:我们要重建一棵二叉树,就要不断地找到根节点和根节点的左子结点和右子节点.注意前序序列, 它的第一个元素就是二叉树的根节点,后面的元素分为它的左子树的前序遍历和右子树的前序遍历.现在的问题是如果光靠前序序列,我们只能找到根节点,但是我们不知道两个子序列的长度,也就无法继续用同样的方法找到子树的根节点.这时候我们就需要一个辅助序列--中序序列,根据它的特性,根节点一定在左子序列和右子序列的中间,这样我们就可以确定两个子序列的长度了. publ…
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析: 根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况: 1.有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点: 2.没有右子树,则判断该节点是否是其父节点的左孩子,如果是则其下一个要找的节点是其父节点: 3.如果不是其父节点…
题目 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制: 0 <= 节点个数 <= 5000 思路:递归 同[LeetCode]105. 从前序与中序遍历序列构造二叉树 关键在与正确定位左右子树范围. 代码 class Solution {…
问题描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7   限制: 0 <= 节点个数 <= 5000 代码 假设先序序列为\(pre_1,...,pre_n\),中序序列为\(in_1,...,in_n\),那么先序序列的第一个元素\(pr…
问题描述 请实现两个函数,分别用来序列化和反序列化二叉树. 示例:  你可以将以下二叉树: 1 / \ 2 3 / \ 4 5 序列化为 "[1,2,3,null,null,4,5]" 代码 这种方法使用了二叉树的层序遍历,第二部分相当于把一个层序遍历的数组重新转化为一个二叉树,构造一个虚拟的节点ans,ans->right指向根节点,也就是要返回的答案,使用left来判断应该添加在根节点的哪一个子节点上. /** * Definition for a binary tree n…
问题描述 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最大深度 3 .   提示: 节点总数 <= 10000 代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left;…
问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)." 例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3…
剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全部代码下载[https://github.com/Wang-Jun-Chao/coding-interviews] 文件夹 第01-10题 [剑指Offer学习][面试题02:实现Singleton 模式--七种实现方式] [剑指Offer学习][面试题03:二维数组中的查找] [剑指Offer学习…
剑指Offer学习 剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退.只有不断地学习才能跟上时候,跟得上技术的潮流! 所有代码下载[https://github.com/Wang-Jun-Chao/coding-interviews] 目录 第01-10题 [剑指Offer学习][面试题02:实现Singleton 模式——七种实现方式] [剑指Offer学习][面试题03:二维数组中的查找] [剑指Offer学习][面…
剑指Offer--滴滴笔试题+知识点总结 情景回顾 时间:2016.9.18 15:00-17:00 地点:山东省网络环境智能计算技术重点实验室 事件:滴滴笔试   总体来说,滴滴笔试内容体量不算多,主要分为19道选择题.1道多选题,2道编程题.1道简答题(也不简单). 选择题   考查知识点:二叉树某层中节点个数(2i-1).费波纳茨数列应用(上9级台阶的方法-分1步.2步).Linux下文件软.硬链接.还有各种计算题(10个人握手,每个人都握一遍,总共握了多少次?12个黑球,个白球,数到13…
剑指Offer--迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试 总体来说,迅雷笔试内容体量不算多,主要分为30道选择题,2道编程题,半小时将选择题做完,1个半小时两道编程题一道29%,一道超时.关键是第二道编程题直接输出错误语句居然通过17%!也是醉了,绝对的判题系统BUG. 知识点回忆 希尔排序 给定一数组元素{50,40,95,20,15,70,60,45},经过一趟希尔排序(参考博文<剑指Of…
剑指Offer--网易笔试题+知识点总结 Fibonacci package cn.edu.ujn.nk; import java.util.ArrayList; import java.util.Scanner; /** * 费波纳茨数 * @author SHQ * */ public class Finonacci { /** * @param args */ public static void main(String[] args) { // System.out.println(fi…
剑指Offer--咪咕笔试题+知识点总结 情景回顾 时间:2016.10.09 15:00-16:30 地点:山东省网络环境智能计算技术重点实验室 事件:咪咕笔试 知识点总结 1.Html设置格式贵阳爽歪歪 Http get与post的区别 1.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如: login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%…
摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就想看看有什么高大上的改造,毕竟要传递多个参数,是不是会涉及到那么一点点设计模式呢?),简直不能忍了,我只能用一句话形容:“一本正经的胡说八道”,不过我就是喜欢看你胡说八道还迷之自信的样子. 下面吐槽一下这个版本的java代码: //高效率的判断是否是一棵平衡二叉树 public boolean isBalan…
题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1. 示例 1: 输入:n = 2 输出:2 示例 2: 输入:n = 7 输出:21 提示: 0 <= n <= 100 思路 同 [剑指Offer]面试题10- I. 斐波那契数列 代码 时间复杂度:O(n) 空间复杂度:O(1) class Solution { public: int…
第 1 天 栈与队列(简单) 剑指 Offer 09. 用两个栈实现队列 class CQueue { public: CQueue() { } stack<int>s1,s2; void appendTail(int value) { s1.push(value); } int deleteHead() { if(s2.empty()) { while(!s1.empty()) { s2.push(s1.top()); s1.pop(); } } if(s2.empty()) return…
剑指Offer(十八):二叉树的镜像 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu_31657889/ github:https://github.com/aimi-cn/AILearners 一.引子 这个系列是我在牛客网上刷<剑指Offer>的刷题笔记,旨在提升下自己的算法能力. 查看完整的剑指Offer算法题解析请点击:剑指Offer完整习题解析 二.题目 操作给定的二叉…
剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu_31657889/ github:https://github.com/aimi-cn/AILearners 一.引子 这个系列是我在牛客网上刷<剑指Offer>的刷题笔记,旨在提升下自己的算法能力. 查看完整的剑指Offer算法题解析请点击:剑指Offer完整习题解析 二.题目 输入一个矩阵…