不积跬步,无以至千里


  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

求解二叉树的深度

发表于 2012-06-06 | 分类于 数据结构与算法 | | 阅读次数:

思路

采用递归求解,对于树tree的深度,其值为:

Depth(tree) =
max(Depth(tree的左子树),Depth(tree的右子树)),tree != NULL
0,tree == NULL

231913132

阅读全文 »

字典树

发表于 2012-06-06 | 分类于 数据结构与算法 | | 阅读次数:

字典树,又名Trier树,可以用于单词的查找和统计。
字典树的示例如下图所示,其中,若根节点为第0层,则第k层节点表示字典中单词前k个字符,从根节点至树中标黄节点的路径表示以该节点字符为末尾的单词,例如,too、tooth、tea、two等。
172655272

阅读全文 »

求解最长单调递增子串

发表于 2012-06-05 | 分类于 数据结构与算法 | | 阅读次数:

求解最长递增子串可分为两种情况,即子串连续或非连续。
例如,对于整数串{1,3,5,1,-1,4,5,3,1,8,3,4,6,2,4,6,7,8,6,4}
其连续递增子串为{2,4,6,7,8},非连续递增子串为{ {-1},{1},{2,4,6,7,8}}

连续递增子串的求解思路:

采用动态规划思想,令
lengthOfSubList[k]表示子串{list[0]…list[k]}中最长的连续递增子串长度
lengthOfSubListIncludeK[k]表示子串{list[0]…list[k]}中以list[k]结尾的最长连续递增子串长度
indexOfLastElement[k]表示子串{list[0]…list[k]}中最长的连续递增子串的最后一个元素的位置
则
lengthOfSubListIncludeK[k] =
lengthOfSubListIncludeK[k-1]+1,list[k]>=list[k-1]
1,list[k]<list[k-1]
lengthOfSubList[k] = max(lengthOfSubListIncludeK[k],lengthOfSubList[k-1])
indexOfLastElement[k] =
k,lengthOfSubListIncludeK[k]>lengthOfSubList[k-1]
indexOfLastElement[k-1],lengthOfSubListIncludeK[k]<=lengthOfSubList[k-1]

阅读全文 »

求和最大的连续子串

发表于 2012-06-05 | 分类于 数据结构与算法 | | 阅读次数:

思路:

采用动态规划进行求解,令:
maxSum[k]表示子串list{0,k}的最大连续子串和,
maxSumIncludeK[k]表示子串list{0,k}中末尾为k的最大连续子串和,
则
maxSumIncludeK[k] = max(list[k],list[k]+maxSumIncludeK[k-1]),
maxSum[k] = max(maxSumIncludeK[k],maxSum[k-1])。

阅读全文 »

不使用加减乘除实现加法

发表于 2012-06-04 | 分类于 数据结构与算法 | | 阅读次数:

思路:

例如:
a=5,b=9,a+b=14
a转换为二进制形式为101,b转换为二进制形式为1001,其和转换为二进制形式为1110。
对于二进制形式的相加,可分两步进行操作:

  1. 先不考虑进位,则0101+1001=1100,从中可以看出,不考虑进位求和即对两个加数进行按位异或操作。
  2. 再考虑进位,则0101+1001=1110=1100+0010,即第一步所得结果再加上进位0010,而0010可通过下述方法进行计算:两个加数进行按为与操作得到0001,再将0001左移一位得到0010。
    采用递归思想,重复进行上述两步操作,直至无进位,可实现不使用加减乘除进行加法操作。
阅读全文 »

线索二叉树:二叉搜索树转换为双向链表

发表于 2012-06-03 | 分类于 数据结构与算法 | | 阅读次数:

对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点。

思路:

采用递归思想,对于二叉搜索树,将左、右子树分别转换为双向链表,左子树转换所得链表的头结点即整个树的头结点,左子树转换所得链表的尾节点与根节点相邻;右子树转换所得链表的尾节点即整个树的尾节点,右子树转换所得链表的头结点与根节点相邻。
152847403

阅读全文 »

根据二叉树的先序、中序遍历结果重建二叉树

发表于 2012-06-03 | 分类于 数据结构与算法 | | 阅读次数:

115527488
先序遍历为:1 2 4 5 3 6,中序遍历为:4 2 5 1 6 3

思路:

先序遍历的第一个元素为根节点,在中序遍历中找到这个根节点,从而可以将中序遍历分为左右两个部分,左边部分为左子树的中序遍历,右边部分为右子树的中序遍历,进而也可以将先序遍历除第一个元素以外的剩余部分分为两个部分,第一个部分为左子树的先序遍历,第二个部分为右子树的先序遍历。
由上述分析结果,可以递归调用构建函数,根据左子树、右子树的先序、中序遍历重建左、右子树。

阅读全文 »

验证栈的出栈序列是否正确

发表于 2012-06-03 | 分类于 数据结构与算法 | | 阅读次数:

思路:

遍历出栈序列,对于其中任一元素k,查看当前栈是否为空,若为空或栈顶元素不等于k,则根据入栈序列进行入栈,直至入栈序列中的元素k入栈。若直至入栈序列末尾仍无k,说明出栈序列错误。入栈完成后,将k出栈。
如上述操作,直至完成出栈序列遍历,说明出栈序列正确。
005203287

阅读全文 »

求二叉树的镜像

发表于 2012-06-02 | 分类于 数据结构与算法 | | 阅读次数:

思路:

采用递归的思想。对于根节点,若其左子树或右子树不为空,则互换左、右子树,然后对于左、右子树,分别递归上述处理方法,直至叶节点。
示例:
232134562

阅读全文 »

链表反转的递归和非递归

发表于 2012-06-01 | 分类于 数据结构与算法 | | 阅读次数:

如题,给出链表反转的递归和非递归算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Node *reverse (Node *head)
{
Node *p1=NULL,*p2=NULL,*p3=NULL;
if(NULL == head || NULL == head->next)
return head;
p1=head;
p2=p1->next;
head->next=NULL;
while(!p2)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
return p2;
};

阅读全文 »
1…789
magicwt

magicwt

89 日志
9 分类
49 标签
GitHub E-Mail
© 2018 magicwt
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4