剑指Offer算法题解30-39

30 包含 min 函数的栈  马上解题

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的 min 函数。

代码

8907519-e3b163933ce48fd0.png


31 栈的压入、弹出序列  马上解题

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。

例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。

代码

8907519-b1f51570132c47d9.png


32.1 从上往下打印二叉树  马上解题

题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

例如,以下二叉树层次遍历的结果为:1,2,3,4,5,6,7

8907519-bcf3beab301a3040.png

解题思路

使用队列来进行层次遍历。

不需要使用两个队列分别存储当前层的节点和下一层的节点,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。

代码

8907519-5d49afa83b9eb325.png


32.2 把二叉树打印成多行  马上解题

题目描述

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

代码

8907519-c0404d6991070fc6.png


32.3 按之字形顺序打印二叉树  马上解题

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

代码

8907519-1ffea82fe00bae88.png


33  二叉搜索树的后序遍历序列  马上解题

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。

例如,下图是后序遍历序列 1,3,2 所对应的二叉搜索树。

8907519-b5cd61fd5d421eba.png

代码

8907519-aab5d5051cb9b5cb.png


34.1 二叉树中和为某一值的路径  马上解题

题目描述

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

下图的二叉树有两条和为 22 的路径:10, 5, 7 和 10, 12

8907519-c6bbda53afa68f91.png

代码

8907519-a3dba376d860d224.png

34.2 路径总和  马上解题

题目描述

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明:叶子节点是指没有子节点的节点。

示例:给定如下二叉树,以及目标和 sum = 22,返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

8907519-d0a26f14b5e3f359.png

代码

8907519-16aa83e29d7ae8b2.png

34.3 路径总和  马上解题

题目描述

给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

8907519-b9513f4f6d94b395.png

代码

8907519-f4d0959c8722305d.png


35. 复杂链表的复制  马上解题

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。

8907519-cbfc62eeb6d23cec.png
8907519-64b1d6742e45479e.png

解题思路

第一步,在每个节点的后面插入复制的节点。

8907519-db661b0bbe9b7cd2.png

第二步,对复制节点的 random 链接进行赋值。

8907519-0c4f278c0e56b5ab.png

第三步,拆分。

8907519-5a677017214f5cea.png

代码

8907519-ef2f590cc4283e3c.png


36 二叉搜索树与双向链表  马上解题

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

8907519-0cc830715498d419.png

代码

8907519-21d4fb1e9196da3e.png


37 序列化二叉树  马上解题

题目描述

请实现两个函数,分别用来序列化和反序列化二叉树。

代码

8907519-6c1c82372454bf4b.png

38 字符串的排列   马上解题

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc,则打印出由字符 a, b, c 所能排列出来的所有字符串 abc, acb, bac, bca, cab 和 cba。

代码

8907519-223e2ec912496d32.png

 
39 数组中出现次数超过一半的数字  马上解题

解题思路

多数投票问题,可以利用 Boyer-Moore Majority Vote Algorithm 来解决这个问题,使得时间复杂度为 O(N)。

使用 cnt 来统计一个元素出现的次数,当遍历到的元素和统计元素相等时,令 cnt++,否则令 cnt--。如果前面查找了 i 个元素,且 cnt == 0,说明前 i 个元素没有 majority,或者有 majority,但是出现的次数少于 i / 2 ,因为如果多于 i / 2 的话 cnt 就一定不会为 0 。此时剩下的 n - i 个元素中,majority 的数目依然多于 (n - i) / 2,因此继续查找就能找出 majority。

代码

8907519-eadf1be66d505730.png

转载于:https://www.jianshu.com/p/ee7d27ff7303

猜你喜欢

转载自blog.csdn.net/weixin_34191845/article/details/91266025