树和二叉树
L_Aster
..
展开
-
已知前序、中序,递归建立二叉树(C语言)
#include <stdio.h>#include <malloc.h>int pre[]={1,2,4,5,3,6,7};//前序序列int ino[]={4,2,5,1,6,3,7};//中序序列struct BTree{ struct BTree *left,*right; int data;};//树节点定义void BuildBTree(struct BTr原创 2017-05-27 17:21:30 · 3467 阅读 · 1 评论 -
线段树的建立、查询、更新及应用
线段树本质上是一棵二叉搜索树(体现在查找阶段),与普通的二叉树不一样,这个二叉树有点特别:用left和right来表示一个区间,即 [left, right],而其值val,则用来表征这个区间的某些特征,例如:区间最大值,区间最小值,区间和;并且容易知道,当left和right相等时,代表叶结点,其值就是某个数组当前位置的值。一棵区间为[1, 5]上的线段树线段树在处理某些问题时是非常方便的,一个经原创 2017-10-15 13:23:14 · 549 阅读 · 0 评论 -
线段树开4N空间证明
线段树采用数组储存时,无疑,其储存空间利用与其左右子树定义有关 方式一:左子树:[l,l+r2][l,\frac{ l+r}{2}]右子树:[l+r2+1,r][\frac{ l+r}{2}+1,r]方式二:左子树:[l,l+r+12−1][l,\frac{ l+r+1}{2}-1]右子树:[l+r+12,r][\frac{ l+r+1}{2}, r]假设定义区间[1,5][1,5]的原创 2017-10-15 19:39:55 · 5172 阅读 · 4 评论 -
有关线段树的一些性质探讨(完全、平衡)
问题线段树含有度为1的结点吗?答:线段树没有度为1的结点。 从递归的角度来看,区间长度为1时,度为0;区间长度为2时,度为2和0;而对于任意区间长度大于2的区间来说,总可以将其分解成更小的左右区间,对于被分的结点,它的度为2,不存在度为1的结点 从另外一方面考虑,假设树中存在度为1的结点A,由于线段树的父结点区间等于左右儿子区间之和,那么A的区间长度等于其儿子的区间长度,又由于线段树中的区间长原创 2017-10-15 17:08:11 · 1655 阅读 · 0 评论 -
trie树(字典树)实现 C++
#include <iostream>#include <vector>#include <string>#include <map>using namespace std;struct TrieNode{ vector<TrieNode*> next; bool end; int cnt; TrieNode():end(0),cnt(0){}};Tr原创 2017-09-08 18:47:54 · 711 阅读 · 0 评论 -
Huffman编码压缩和解压文档,C++实现
关于huffman树及相关算法这里就略过,这里探讨的是如何进行编码和解压缩。先说一下大致步骤 1.首先,读取文档(txt格式),将其存入string类型的变量pretext里 2.进行词频统计 3.创建Huffman树,并以此得到各字符的二进制编码 4.对pretext进行遍历,通过上面得到编码表,将其转化为二进制字符串code,这个二进制串可能十分长 5.将二进制串进行八位一编码,得到压原创 2017-08-24 17:37:13 · 714 阅读 · 0 评论 -
AVL树的旋转、插入、删除及遍历C语言实现
MARK一篇关于AVL树的博客文章:数据结构图文解析之:AVL树详解及C++模板实现一、AVL结构定义struct AVLNode{ int val; struct AVLNode *left,*right; int height;//AVL树的高度};typedef struct AVLNode AVLNode;注:在节点中添加高度标记的原因在于,...原创 2016-12-13 08:58:28 · 3149 阅读 · 0 评论 -
二叉树前序、中序、后序递归遍历实现(C语言)
void preTreverse(struct BTree *T)//前序遍历{ if(T) { printf("%d ",T->data); Treverse(T->left); Treverse(T->right); }}void inTreverse(struct BTree *T)//中序遍历{ if(T原创 2017-05-27 18:15:22 · 1307 阅读 · 2 评论 -
二叉树前序、中序、后序非递归遍历实现(C语言)
一、非递归前序遍历void TreversePreorder(struct BTree *T){ struct BTree *stack[1000],*p=T;//建立栈 int top=0; while(p||top) { if(p) { printf("%d ",p->data);//第一次遇见时就访问原创 2017-05-27 17:58:33 · 12217 阅读 · 2 评论 -
求二叉树的高度
一、递归实现int Max(int a,int b)//a,b中的最大值{ return a>b?a:b;}int GetHeight(struct BTree *T){ if(!T) return 0;//递归出口 return Max(GetHeight(T->left),GetHeight(T->right))+1;//递归求出左子树和右子树的高度}原创 2017-05-27 17:32:52 · 558 阅读 · 0 评论 -
树状数组
树状数组C,实际上就是一个数组,虽然看上去像棵树,但是本质上还是数组,这个数组比较特别,因为它其中的某个元素,可能表示原数组A元素本身,也有可能表示A数组元素的一段区间和,也有可能表示其树状数组C本身中的一些元素和,下边这幅图形象的表示了数组A以及树状数组C 树状数组(站坑)原创 2017-10-16 21:54:16 · 260 阅读 · 0 评论