摘要: 问题给出一个元素以递增序列排序的单链表,将其转换为一棵高度平衡的二叉搜索树。初始思路二叉搜索树高度平衡,意味着左右子树的高度要平衡。根据二叉树左子树节点小于根节点,右子树节点大于根节点的性质:我们在待选节点中选择值为中位数的节点作为根节点,所有小于中位数的节点作为左子树,所有大于中位数的节点作为右子树,即可满足高度平衡的要求。由于题目给出的已经是排好序的单链表,我们只要每次选择中间的节点即可。然后通过递归处理左右子树,最终完成高度平衡二叉搜索树的构建。最终完成代码如下: 1 class Solution { 2 enum ChildType 3 { 4 ... 阅读全文
posted @ 2013-08-23 00:19 Shawnone 阅读(536) 评论(0) 推荐(0) 编辑
摘要: 问题给出一棵二叉树,判断它是否在高度上是平衡的。对于本问题,高度上平衡的二叉树定义为:每个节点的两棵子树的深度差永远不大于1的一棵二叉树。初始思路根据定义,思路应该比较直接:递归计算每个节点左右子树的深度,只要发现一次深度差大于1的情况,即可终止递归返回不平衡的结果。最终代码如下: 1 class Solution 2 { 3 public: 4 bool isBalanced(TreeNode *root) 5 { 6 if(!root) 7 { 8 return ... 阅读全文
posted @ 2013-08-01 00:05 Shawnone 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 问题给出一棵二叉树,找出它的最小深度。最小深度是指从根节点沿着最短路径下降到最近的叶子节点所经过的节点数。初始思路不难看出又是一个需要层次遍历二叉树的题目,只要在112基础上作出简单修改即可得出答案。 1 class Solution 2 { 3 public: 4 int minDepth(TreeNode *root) 5 { 6 if(!root) 7 { 8 return 0; 9 }10 11 ... 阅读全文
posted @ 2013-07-25 23:06 Shawnone 阅读(496) 评论(0) 推荐(0) 编辑
摘要: 问题给出一棵二叉树及一个和值,检查该树是否存在一条根到叶子的路径,该路径经过的所有节点值的和等于给出的和值。例如,给出以下二叉树及和值22: 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1函数返回true,因为存在一条根到叶子的路径5->4->11->2,其路径和为22。初始思路鉴于题目要求找到一条路径和符合要求即可,选择层次遍历二叉树是一种比较合适的选择-保证了我们首先找到的是最短的路径从而节省了时间。另外由于没有禁止修改原二叉树的值,我们在处理过程中可以把每个点的值修改为到达这点时的路径和,方便比较。至于层次遍历的方法,... 阅读全文
posted @ 2013-07-25 22:51 Shawnone 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 问题给出一个二叉树,将其原地平面化为链表。例如,给出: 1 / \ 2 5/ \ \ 3 4 6平面化后的树看起来应该是这样: 1\ 2 \ 3 \ 4 \ 5 \ 6初始思路观察例子中平面化的过程,不难发现其实就是一个二叉树前序遍历的过程。让我们复习一下二叉树前序遍历的方法,根据wiki条目Tree traversal,伪代码如下:preorder(node) if node == null then return visit(node) preorder(node.left) preorder(node.ri... 阅读全文
posted @ 2013-07-17 23:27 Shawnone 阅读(343) 评论(0) 推荐(0) 编辑
摘要: 问题给出字符串S和T,计算S中为T的不同的子序列的个数。一个字符串的子序列是一个由该原始字符串通过删除一些字母(也可以不删)但是不改变剩下字母的相对顺序产生的一个新字符串。如,ACE是ABCDE的一个子序列,但是AEC不是。这里有一个例子:S=“rabbbit”,T=“rabbit”返回值应为3初始思路要找出子序列的个数,首先要有找出S中为T的子序列的方法。T是S的子序列,首先其每一个字母肯定会在S中出现,通过遍历T的每一个字母即可完成这个检查。而根据不能乱序的要求,下一个字母在S中出现的位置不能在上一个字母在S中出现的位置之前。由此,我们得到下面的算法:循环遍历T 如果当前字母在S中,而且在 阅读全文
posted @ 2013-07-15 23:09 Shawnone 阅读(3464) 评论(1) 推荐(0) 编辑
摘要: 问题给出如下结构的二叉树:struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next;}填充每一个next指针使其指向自己的右边邻居节点。如果没有右边的邻居节点,next指针须设成NULL。在开始时,所有的next指针被初始化成NULL。注意:你只能使用常数级别的额外空间你可以假设该树为完全二叉树(即所有叶子节点都在同一层,而且每个父节点都有两个子节点)。例如,给出如下完全二叉树: 1 / \ 2 3 / \ / \ 4 5 6 7在调用你的函数后,树看起来... 阅读全文
posted @ 2013-07-09 21:41 Shawnone 阅读(1759) 评论(0) 推荐(0) 编辑
摘要: 问题给出变量numRows,生成杨辉三角形的前numRows行。例如,给出numRows=5,返回:[ [1], [1,1], [1,2,1], [1,3,3,1],[1,4,6,4,1]]初始思路基本算法和杨辉三角形II(Pascal's Triangle II)的基本一致。每算完一行的值将这些值拷贝一份到vector中即可。代码如下: 1 class Solution { 2 public: 3 std::vector > generate(int numRows) 4 { 5 std::vector > result; ... 阅读全文
posted @ 2013-07-02 23:55 Shawnone 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 问题给出一个索引k,返回杨辉三角形的第k行。例如,给出k = 3,返回[1, 3, 3, 1]注意:你可以优化你的算法使之只使用O(k)的额外空间吗?初始思路首先来复习复习杨辉三角形的性质(来自wiki):杨辉三角以正整数构成,数字左右对称,每行由1开始逐渐变大,然后变小,回到1。第行的数字个数为个。第行的第个数字为组合数。第行数字和为。除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第行第个数字等于第行的第个数字与第个数字的和)。这是因为有组合恒等式:。可用此性质写出整个杨辉三角形。看到第2条和5条是不是发现和[LeetCode 120] - 三角形(T 阅读全文
posted @ 2013-06-30 19:11 Shawnone 阅读(1416) 评论(0) 推荐(1) 编辑
摘要: 问题给出一个三角形,找出从顶部至底部的最小路径和。每一步你只能移动到下一行的邻接数字。例如,给出如下三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]从顶部至底部的最小路径和为11(即2+3+5+1=11)。注意:加分项-如果你能只使用O(n)的额外空间,n为三角形中的总行数。初始思路最直接的思路就是把路径都走一遍。即从顶点出发,分别往左中右移动(如果可能的话);然后对走到的位置继续进行同样移动,直到走到最后一行。这样就可以得到一个递归的方案,而递归的结束条件就是前面所说的走到最后一行。伪代码如下:[最短路径长度] 查找路径(当前节点坐标,当前路径值)如果是最后一行.. 阅读全文
posted @ 2013-06-29 15:48 Shawnone 阅读(2309) 评论(3) 推荐(0) 编辑