コード例 #1
0
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;
}
コード例 #2
0
ファイル: huffman.cpp プロジェクト: bondyuan/exercise
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;
}
コード例 #3
0
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;
}
コード例 #4
0
/*
* @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;
	}
}