BiTree CreatTree(DataType *datas, int len, int *i) { BiNode *root; if ((*i) > len) return NULL; if (datas[*i] == ' ') { (*i)++; return NULL; } root = (BiNode*)malloc(sizeof(BiNode)); root->data = datas[*i]; (*i)++; root->lchild = CreatTree(datas, len, i); root->rchild = CreatTree(datas, len, i); return root; }
std::string HuffmanEncode(int n, const std::string& s, std::map<char, std::string>& code_table) { int array_len = n; int new_index = n; while (array_len > 1) { int min = 0; int sub_min = 0; GetMin(min, sub_min, new_index); CreatTree(min, sub_min, new_index); --array_len; ++new_index; } root = new_index - 1; std::string encoded_str; OutputCode(n, code_table, s, encoded_str); return encoded_str; }
int main() { char str[20000]; int i; while (gets(str)) { BiTree T; T = NULL; i = 0; T = CreatTree(str, strlen(str), &i); /*PreVisit(T); printf("\n"); MidVisit(T); printf("\n");*/ MidVisit(T); printf("\n"); //AftVisit(T); //printf("\n"); } return OK; }
/* * @function CreatTree 递归DFS创建并输出决策树 * @param: treeHead 为生成的决定树 * @param: statTree 为状态树,此树动态更新,但是由于是DFS对数据更新,所以不必每次新建状态树 * @param: infos 数据信息 * @param: readLine 当前在infos中所要进行统计的行数,由函数外给出 * @param: deep 决定树的深度,用于打印 * @return void */ void DecisionTree::CreatTree(TreeNode* treeHead, vector<attributes*>& statTree, vector<vector<string>>& infos, set<int>& readLine, vector<int>& readClumNum, int deep) { //有可统计的行 if (readLine.size() != 0) { string treeLine = ""; for (int i = 0; i < deep; i++) { treeLine += "--"; } //清空其他属性子树,进行递归 resetStatTree(statTree, readClumNum); //统计当前readLine中的数据:包括统计哪几个属性、哪些行, //并生成statTree(由于公用一个statTree,所有用引用代替),并返回目的信息数 int deciNum = statister(getInfos(), statTree, readLine, readClumNum); int lineNum = readLine.size(); int attr_node = compuDecisiNote(statTree, deciNum, lineNum, readClumNum);//本条复制为局部变量 //该列被锁定 readClumNum[attr_node] = 1; //建立树根 TreeNode* treeNote = new TreeNode(); treeNote->m_sAttribute = statTree[attr_node]->attriName; treeNote->m_iDeciNum = deciNum; treeNote->m_iUnDecinum = lineNum - deciNum; if (treeHead == nullptr) { treeHead = treeNote; //树根 } else { treeHead->m_vChildren.push_back(treeNote); //子节点 } cout << "节点-"<< treeLine << ">" << statTree[attr_node]->attriName << " " << deciNum << " " << lineNum - deciNum << endl; //从孩子分支进行递归 for(map<string, attrItem*>::iterator map_iterator = statTree[attr_node]->attriItem.begin(); map_iterator != statTree[attr_node]->attriItem.end(); ++map_iterator) { //打印分支 int sum = map_iterator->second->itemNum[0]; int deci_Num = map_iterator->second->itemNum[1]; cout << "分支--"<< treeLine << ">" << map_iterator->first << endl; //递归计算、创建 if (deci_Num != 0 && sum != deci_Num ) { //计算有效行数 set<int> newReadLineNum = map_iterator->second->itemLine; //DFS CreatTree(treeNote, statTree, infos, newReadLineNum, readClumNum, deep + 1); } else { //建立叶子节点 TreeNode* treeEnd = new TreeNode(); treeEnd->m_sAttribute = statTree[attr_node]->attriName; treeEnd->m_iDeciNum = deci_Num; treeEnd->m_iUnDecinum = sum - deci_Num; treeNote->m_vChildren.push_back(treeEnd); //打印叶子 if (deci_Num == 0) { cout << "叶子---"<< treeLine << ">no" << " " << sum << endl; } else { cout << "叶子---"<< treeLine << ">yes" << " " << deci_Num <<endl; } } } //还原属性列可用性 readClumNum[attr_node] = 0; } }