随笔分类 -  Tree

摘要:亲戚题:已知a和b是亲戚,a和c是亲戚,则可以判断出b和c也是亲戚。将多个集合合并成没有交集的集合。 1 #include <iostream> 2 using namespace std; 3 4 int N, M, Q; 5 int pre[20000], rak[20000]; 6 7 void MakeSet(int x) 8 { 9 pre[x] = -1;10 rak[x] = 0;11 }12 13 int FindSet(int x)14 {15 int r = x, q;16 while (pre[r] != -1)17 r... 阅读全文

posted @ 2013-06-20 11:02 月moon鸟 阅读(170) 评论(0) 推荐(0)

摘要:Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。可以统计词频或是判断是否是前缀。1000万的广告库关键词,来一个查询词,找出是查询词子集的关键词集合。 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 #define MAX 256 6 #define MAXLEN 256 7 8 typedef struct _TrieNode 9 {10 int count;11 struct _Tri 阅读全文

posted @ 2013-06-20 10:50 月moon鸟 阅读(236) 评论(0) 推荐(0)

摘要:前序,中序,后序遍历的非递归实现。层次遍历,从上到下或从下到上,从左到右或从右到左,只输出叶子节点,只输出某一层等等。1、代码: 1 void PreOrder(BinaryTreeNode* root) 2 { 3 if (!root) return; 4 stack<BinaryTreeNode*> nodes; 5 while (root != NULL || !nodes.empty()) 6 { 7 if (root != NULL) 8 { 9 cout << root->m_nValue <<... 阅读全文

posted @ 2013-06-07 21:00 月moon鸟 阅读(177) 评论(0) 推荐(0)

摘要:多段区间,求重合次数最多的区间或是给一个查询点判断该点在这些区间中存在的次数。多条线段,求线段覆盖长度,重合记为一次。1、思路: 非线段树:先对首尾排序(首尾端点没有差异),然后按顺序遍历结点,(L,+1)操作,(R,-1)操作。 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 #define NUM 5 6 7 typedef struct _guest 8 { 9 int arrival;10 int leave;11 }g 阅读全文

posted @ 2013-05-19 21:05 月moon鸟 阅读(192) 评论(0) 推荐(0)

摘要:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。把一个有序整数数组放到一棵二叉树中,要求树的高度最小。1、思路: 前序遍历的第一个是根结点,在中序遍历中找到该结点,则该结点左侧是左子树的范围,右侧是右子树的范围。由该范围再去前序遍历数组中圈定同样个数的左右子树。同理递归处理左右子树。Construct 1 BinaryTreeNode* Construct(int* preorder, int* inorder, int length) 2 { 3 if(preorder == NULL || inorder ... 阅读全文

posted @ 2013-04-14 21:59 月moon鸟 阅读(215) 评论(0) 推荐(0)

摘要:输入一棵二叉树的根节点,求该树的深度即最长路径。输入一颗二叉树的根节点,判断是否是平衡二叉树。求二叉树中节点的最大距离。1、思路: 根结点的高度等于左右子树中大者+1,也就是说先算完左右子树的高度之后再算根节点的高度,即后序遍历。TreeDepth 1 int TreeDepth(BinaryTreeNode* pRoot) 2 { 3 if(pRoot == NULL) 4 return 0; 5 6 int nLeft = TreeDepth(pRoot->m_pLeft); 7 int nRight = TreeDepth(pRoot->m_p... 阅读全文

posted @ 2013-04-14 21:30 月moon鸟 阅读(369) 评论(0) 推荐(0)

摘要:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。1、思路: 二叉搜索树的一大特点就是中序遍历可以将二叉搜索树从小到大排列。需要维护一个变量存放前一个访问到的元素,使该元素的右指针指向当前节点,当前节点的左指针指向该元素。终止条件是到达叶子节点。Convert 1 BinaryTreeNode* Convert(BinaryTreeNode* pRootOfTree) 2 { 3 BinaryTreeNode *pLastNodeInList = NULL; 4 ConvertNode(pRootOfTree, &pLastNodeInList); 5 6 ... 阅读全文

posted @ 2013-04-14 21:00 月moon鸟 阅读(292) 评论(0) 推荐(0)

摘要:参考:http://zhedahht.blog.163.com/请完成一个函数,输入一个二叉树,输出它的镜像。输入两颗二叉树A和B,判断B是不是A的子结构。输入一棵二叉树和一个整数,打印出二叉树中结点值和为该整数的所有路径。1、思路: 先序遍历。对每个子树的根结点,交换左右子树的指向,终止条件是到达叶子节点,就不需要交换左右子节点了。MirrorRecursively 1 void MirrorRecursively(BinaryTreeNode *pNode) 2 { 3 if((pNode == NULL) || (pNode->m_pLeft == NULL && 阅读全文

posted @ 2013-04-14 20:50 月moon鸟 阅读(484) 评论(0) 推荐(0)

摘要:从上向下打印二叉树的每个节点, 同一层的节点按照从左到右的顺序打印。判断一棵树是否是完全二叉树。将一棵完全二叉树层次遍历转化为一个链表。(不用队列)1、思路: 可以使用双端队列deque容器,头负责打印,尾负责接受子节点,直到deque中没有元素为止。 1 void PrintBiTreeBreadth(BiTreeNode* root) 2 { 3 if (root == NULL) return; 4 deque<BiTreeNode*> dequeBiTreeNode; 5 dequeBiTreeNode.push_back(root); 6 while... 阅读全文

posted @ 2013-04-08 14:57 月moon鸟 阅读(374) 评论(0) 推荐(0)

导航