题目描述: 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 分析: 平衡二叉树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树,反之则不一定.平衡二叉树的常用实现方法有红黑树.AVL.替罪羊树.Treap.伸展树等. 根据定义两个子树的高度差的绝对值不超过1,那么可以通过递归求出左右子树的高度,计…
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 牛客网链接 java代码 import java.lang.Math; public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if (root == null) return true; return getDeepth(root) != -1; } private int getDeepth(TreeNode root) { if (roo…
该题目来源于牛客网<剑指offer>专题. 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / 9 20 / 15 7 返回 true . 示例 2: 给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / 2 2 / 3 3 / 4 4 返回 false . Go语言实现: /** * Definitio…
  本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 思路 在(55-1) 二叉树的深度基础上修改:计算树的深度,树的深度=max(左子树深度,右子树深度)+1.在遍历过程中,判断左右子树深度相差是否超过1,如果不平衡,则令树的深度=-1,用来表示树不平衡.最终根据树的深度是否等于-1来确定是否…
所列题目与牛客网<剑指offer>专题相对应. 数组: 和为S的两个数字 和为S的连续正数序列 连续子数组的最大和 数字在排序数组中出现的次数 数组中只出现一次的数字 旋转数组的最小数字 数组中的逆序对 最小的K个数 数组中出现次数超过一半的数字 把数组排成最小的数 数组中重复的数字 滑动窗口的最大值 构建乘积数组 数据流中的中位数 二维数组中的查找 顺时针打印矩阵 扑克牌顺子 调整数组顺序使奇数位于偶数前面 链表: 链表中环的入口结点 删除链表中重复的结点 从尾到头打印链表 两个链表的第一个…
剑指offer 面试题39:判断平衡二叉树 提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=13&tqId=11192 时间限制:1秒       空间限制:32768K      参与人数:2481 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 分析: 平衡二叉树定义 递归解法 AC代码: #include<iostream> #include<vector&…
一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点为根节点的子树的高度,通过判断左右子树的高度差是否大于1来判断是否为AVL树.其中计算子树的高度,利用了TreeDepth函数(具体可见<剑指offer(第二版)>P272).其中TreeDepth的思想如下: (1)计算一颗二叉树的高度,可以将该问题转化成求子树的高度+1.如果根节点只有左子树的…
该题目来源于牛客网<剑指offer>专题. 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7.习惯上我们把1当做是第一个丑数. 求按从小到大的顺序的第N个丑数. Go语言实现: func getUglyNumber(index int) int { //第0-6个丑数,分别是0-6 if index < 7 { return index } ​ i2 := 0 i3 := 0 i5 := 0 //从1开始,1*2,1*3,…
该题目来源于牛客网<剑指offer>专题. 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 先放21,则f(n-1),先放12,则f(n-2). Go语言实现: func rectCover(n int) int { if n < 1 { return 0 } ​ if n == 1 || n == 2 { return n } ​ return rectCover(n-1) + rectCover(n-2)…
该题目来源于牛客网<剑指offer>专题. 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 找规律: 1阶:1种: 2阶:2种: 3阶:4种: 4阶:8种: n阶:2f(n-1)种: 或者: n-1阶:f(n-2)+f(n-3)+-f(1)+f(0) n阶:f(n-1)+f(n-2)+-f(1)+f(0) => 2f(n-1) 得出一个斐波那契函数. Go语言实现: 方法一:递归 func jumpFloor2(N int)…
该题目来源于牛客网<剑指offer>专题. 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 1阶:共1种跳法: 2阶:共2种跳法: 3阶:共3种跳法: n阶:先跳1级,还剩n-1级,跳法是f(n-1):先跳2级,还剩n-2级,跳法是f(n-2),共f(n-1)+f(n-2)种跳法: 得出一个斐波那契函数. Go语言实现: 方法一:递归 func jumpFloor(N int) int { if N <= 0 { r…
该题目来源于牛客网<剑指offer>专题. 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0) n<=39 Go语言实现: 递归: func fib(N int) int { if N == 0 { return 0 } if N == 1 { return 1 } return fib(N-1) + fib(N-2) } 迭代: func fib(N int) int { if N == 0 { return 0 } if N == 1…
该题目来源于牛客网<剑指offer>专题. 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) Go语言实现: func isPopOrder(push, pop []int) bool { if len(push) == 0 || len(po…
该题目来源于牛客网<剑指offer>专题. 请实现一个函数,将一个字符串中的每个空格替换成"%20". 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. Go语言实现: func replaceSpace(str string) string { //最后一个参数为替换次数,负数表示没有次数限制 str = strings.Replace(str, " ", "%20", -1) r…
该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值.但是"12e","1a3.14","1.2.3","±5"和"12e+4.3"都不是. Go语言…
该题目来源于牛客网<剑指offer>专题. 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写) Go语言实现: func firstUniqChar(s string) int { //假设都是大小写字母,定义一个数组 list := [52]int{} //算出每个字符出现的次数 for _, x := range s { list[x-'a']++ } //算出首次出现且次数为1的…
该题目来源于牛客网<剑指offer>专题. 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入描述: 输入一个字符串,包括数字字母符号,可以为空. 输出描述: 如果是合法的数值表达则返回该数字,数值为0或者字符串,不是一个合法的数值则返回0. ​ Go语言实现: //0-9的ascii码分别是48-57,"-"是45,"+"是43 func strToInt(str string) int { length := len(str) i…
该题目来源于牛客网<剑指offer>专题. 例如,"student. a am I",正确的句子应该是"I am a student." Go语言实现: func reverseSentence(str string) { //strings.Fields(s string) []string,直接返回使用空格分割的字符串 strArray := strings.Fields(str) for i := len(strArray) - 1; i >…
该题目来源于牛客网<剑指offer>专题. 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出. 例如,字符序列S="abcXYZdef",要求输出循环左移3位后的结果,即"XYZdefabc". Go语言实现: func leftRotateString(str string, k int) string { length := len(st…
该题目来源于牛客网<剑指offer>专题. 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0. Go语言实现: func power(base float64, exponent int) float64 { result := 1.0 //指数为0 if exponent == 0 && base != 0 { return 1 } //指数为负 if exponent &…
该题目来源于牛客网<剑指offer>专题. 第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111. 第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1. 第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1. 继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果…
该题目来源于牛客网<剑指offer>专题. 求1+2+3+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). Go语言实现: func sumSolution(n int) int { return (int(math.Pow(float64(n), 2)) + n) >> 1 } ​ public static int Sum_Solution(int n) { int sum = n; boolean f…
该题目来源于牛客网<剑指offer>专题. 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析: 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1.其余所有位将不会受到影响. 一个二进制数1100,从右边数起第三位是处于最右边的一个1,减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011. 我们发现减1的结果是把最右边的一个1开始的所有位都取…
该题目来源于牛客网<剑指offer>专题. 给定一棵二叉搜索树,请找出其中的第k小的结点.例如,(5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. Go语言实现: type TreeNode struct { Val int Left *TreeNode Right *TreeNode } ​ var index = 0 func kNode(root *TreeNode, k int) *TreeNode { if root != nil { node := kNod…
该题目来源于牛客网<剑指offer>专题. 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) Go语言实现: type TreeNode struct { Val int Left *TreeNode Right *TreeNode } ​ //b是否和a的跟结点或左子树的跟结点或右子树的跟结点一致 func hasSubtree(a *TreeNode, b *TreeNode) bool { return isSubtree(a, b) || ha…
该题目来源于牛客网<剑指offer>专题. 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先序.中序.后序.层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 !表示一个结点值的结束(value!). 二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树. Go语言实现: type…
该题目来源于牛客网<剑指offer>专题. 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. Go语言实现: type TreeNode struct { Val int Left *TreeNode Right *TreeNode } ​ func printTreeNode(root *TreeNode) [][]int { var result [][]int if root == nil {…
该题目来源于牛客网<剑指offer>专题. 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 不需分层,一维数组. Go语言实现: /** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func levelOrder(root *TreeNode) []int { var result []int if ro…
该题目来源于牛客网<剑指offer>专题. 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 需要分层,二维数组. Go语言实现: /** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func levelOrder(root *TreeNode) [][]int { var result [][]…
该题目来源于牛客网<剑指offer>专题. 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. Go语言实现: type TreeNode struct { Val int Left *TreeNode Right *TreeNode Parent *TreeNode } ​ func getNext(node *TreeNode) *TreeNode { if node == nil { return ni…