TreeNode *build_sub_tree(vector<int> &preorder, int pre_start, int pre_end,
                          vector<int> &inorder, int in_start, int in_end) {
     if (pre_start > pre_end) return NULL;
     int root_val = preorder[pre_start], root_index_inorder = in_start;
     while (inorder[root_index_inorder] != root_val) {root_index_inorder++;}
     int left_tree_end_preorder = pre_start + (root_index_inorder - in_start);
     TreeNode *root = new TreeNode(root_val);
     root->left = build_sub_tree(preorder, pre_start + 1, left_tree_end_preorder,
                                 inorder, in_start, root_index_inorder - 1);
     root->right = build_sub_tree(preorder, left_tree_end_preorder + 1, pre_end,
                                  inorder, root_index_inorder + 1, in_end);
     return root;
 }
 TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
     return build_sub_tree(preorder, 0, preorder.size() - 1,
                           inorder, 0, inorder.size() - 1);
 }
Example #3
0
void conditional_parrern_base(struct node *fptree, struct header_table *htable, int *item_counter,int *item_index, char *generate_string) {	
	struct frequent_patterns *fp = malloc(sizeof(struct frequent_patterns));
	struct frequent_patterns *fp_head = malloc(sizeof(struct frequent_patterns));
	
	struct node *now_node = malloc(sizeof(struct node));
	int ptr_index; 
	fp_head = fp;	
	if(generate_string != "") //printf("%s \n", generate_string);
	while(htable != NULL) {			
		fp = fp_head;
		fp->next = NULL;
		fp->index = 0;
		listStart(htable->cond);		
		while(listNext(htable->cond)) {			
			now_node = listGet(htable->cond);			
			if(fp->index == 0) {
				fp->ptr  = malloc(sizeof(short) * MIN_SUPPORT_INDEX);
			}
			else {
				struct frequent_patterns *new_fp = malloc(sizeof(struct frequent_patterns));
				new_fp->ptr  = malloc(sizeof(short) * MIN_SUPPORT_INDEX);
				fp->next 	 = new_fp;
				fp 			 = new_fp;
			}
			
			fp->counter = now_node->counter;				
			fp->htable_value = htable->no;
			ptr_index   = 0;
			now_node = now_node->parent;
			while(now_node != NULL) {			
				if( now_node->no == -1) break;
				*(fp->ptr + ptr_index) = now_node->no;
				ptr_index++;
				now_node = now_node->parent;
			}						
			fp->index = ptr_index;
		}
		
		struct header_table *sub_htable = malloc(sizeof(struct header_table));		
		struct node         *sub_tree   = malloc(sizeof(struct node));			
		
		sub_tree = create_fptree();						
		sub_tree = build_sub_tree(sub_tree, sub_htable, fp_head, item_counter, item_index);
		
		//dfs(sub_tree);		
		if(sub_tree->child != NULL) {			
			int len = strlen(generate_string) + 4;	
			char *str_ans = malloc(sizeof(char) * len);	
			myString_cat(str_ans, generate_string, htable->no);			
			
			while(sub_htable->next != NULL) sub_htable = sub_htable->next;					
			
			conditional_parrern_base(sub_tree, sub_htable, item_counter, item_index,  str_ans);
			
			dfs(sub_tree);			
			
		}else if(htable->prev == NULL || listCount(htable->cond) > 0){			
			int len = strlen(generate_string) + 4;	
			char *str_ans = malloc(sizeof(char) * len);	
			myString_cat(str_ans, generate_string, htable->no);			
			//printf("%s\n", str_ans);
		}		
		
		htable = htable->prev;
	}		
	while(htable != NULL) {
		header_head = htable;
		htable 	    = htable->next;
		free(header_head);			
	}
	
}