data-structure-huffman树及其编码
二叉树的确定:
举例:如果我们知道了先序序列abdecfgh和中序序列dbeacgfh,求确定这个二叉树的结构
1 | BTNode *createBT(char pre[],char in[],int L1,int R1,int L2,int R2) |
其中pre[]
是先序序列,in[]
是中序序列,L1,R1
是先序序列的范围,L2,R2
是中序序列的范围
这里就使用了一个递归,分别处理根结点下的左右子树,子树下的左右子树,如此递归下去。
其中12和13行的理由见下面:
1 | pre: |
举例:如果我们知道了中序遍历序列debghfca和后序遍历序列dbeacgfh,请确定二叉树
1 | BTNode *createBT2(char post[],char in[],int L1,int R1,int L2,int R2) |
层次遍历序列和中序遍历序列确定二叉树:
1 | int search(char arr[],char key,int L,int R) //查找函数,传入一个数组arr,key是要查找的值,L,R是范围 |
在先序和中序序列来确定儿二叉树的情况时,知道了根结点之后,就可以在中序序列中,划分出左右子树是什么,因为他们是连续的,而在层次遍历中,他们是分散开来的,所以就有了getsubLevel函数,去查找他们,然后放到LLevel和RLevel数组中。这个函数具体是怎么做的呢,如图:
首先i将in数组(中序遍历序列)分成了左右不同的两个部分,分别是左右子树,下面是左右部分的元素在level数组中的分布情况,互相交错。我们是这样做的:在in数组中的L-i-1范围,用关键字t在level中扫描,看有和在数组in中L到i-1相同的值,有就把他们存到LLevel中。
getsublevel中sublevel是存储结果的数组,n是代表level的长度,L,R是要取的元素的范围。k是辅助从sublevel中插入元素。