//删除树的节点 bool tree_delete(s_tree *tree, s_node *node, int leftright) { if (tree == null) { return false; } if (node == null) { return false; } //删除左子树 if (leftright == 0) { tree_delete_node(tree, node->left_child); node->left_child = null; } //删除右子树 else if (leftright == 1) { tree_delete_node(tree, node->right_child); node->right_child = null; } //如果是根节点则清空树 if (node == tree->root) { tree->root = null; } return true; }
//删除节点 void tree_delete_node(s_tree *tree, s_node *node) { if (node == null) { return; } //递归删除左子树 tree_delete_node(tree, node->left_child); //递归删除右子树 tree_delete_node(tree, node->right_child); if (node->data != null) { tree->free_node(node->data); } //删除左节点 node->left_child = null; //删除右节点 node->right_child = null; //如果是根节点则清空树 if (node == tree->root) { tree->root = null; } free(node); }
void ami_gui_cert_close(struct session_data *data) { unsigned long i; if(data->tree->handle) { ami_tree_close((struct treeview_window *)data->tree->handle); win_destroyed = true; } assert(data); /* for (i = 0; i < data->num; i++) { if (data->certs[i].subject) textarea_destroy(data->certs[i].subject); if (data->certs[i].issuer) textarea_destroy(data->certs[i].issuer); } */ if (data->tree) { tree_delete_node(data->tree, data->tree->root, false); free(data->tree); } free(data->certs); free(data->url); free(data); }
void tree_destroy(Node *node) { if (node->left != NULL) { tree_destroy(node->left); } if (node->right != NULL) { tree_destroy(node->right); } tree_delete_node(node); }
/** * Creates a tree entry for a URL, and links it into the tree * * \param parent the node to link to * \param url the URL (copied) * \param data the URL data to use * \param title the custom title to use * \return the node created, or NULL for failure */ struct node *tree_create_URL_node(struct tree *tree, struct node *parent, const char *url, const char *title, tree_node_user_callback user_callback, void *callback_data) { struct node *node; struct node_element *element; char *text_cp, *squashed; squashed = squash_whitespace(title ? title : url); text_cp = strdup(squashed); if (text_cp == NULL) { LOG(("malloc failed")); warn_user("NoMemory", 0); return NULL; } free(squashed); node = tree_create_leaf_node(tree, parent, text_cp, true, false, false); if (node == NULL) { free(text_cp); return NULL; } if (user_callback != NULL) tree_set_node_user_callback(node, user_callback, callback_data); tree_create_node_element(node, NODE_ELEMENT_BITMAP, TREE_ELEMENT_THUMBNAIL, false); tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_VISITS, false); tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_LAST_VISIT, false); element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_URL, true); if (element != NULL) { text_cp = strdup(url); if (text_cp == NULL) { tree_delete_node(tree, node, false); LOG(("malloc failed")); warn_user("NoMemory", 0); return NULL; } tree_update_node_element(tree, element, text_cp, NULL); } return node; }
void run_tests(void) { Tree_node * tree = tree_create(42); Tree_node * node = tree_insert_balanced(tree, 50); my_assert(tree_find(tree, 50) == node); Tree_node * node2 = tree_insert_balanced(tree, 30); my_assert(tree_get_height(tree) == 2); tree_insert_raw(node2, 5, LEFT); my_assert(tree->left->left->data == 5); tree_insert_balanced(tree, 30); my_assert(tree->left->left->data == 5); tree_delete_node(tree, LEFT); my_assert(tree->left == NULL); my_assert(tree_get_height(tree) == 2); my_assert_conclude(); }
static struct node *sslcert_create_node(const struct ssl_cert_info *cert) { struct node *node; struct node_element *element; char *text; text = messages_get_buff("SSL_Certificate_Subject", cert->subject); if (text == NULL) return NULL; node = tree_create_leaf_node(NULL, NULL, text, false, false, false); if (node == NULL) { free(text); return NULL; } tree_set_node_user_callback(node, sslcert_node_callback, NULL); /* add issuer node */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_ISSUER, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_Issuer", cert->issuer); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* add version node */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_VERSION, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_Version", cert->version); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* add valid from node */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_VALID_FROM, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_ValidFrom", cert->not_before); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* add valid to node */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_VALID_TO, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_ValidTo", cert->not_after); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* add certificate type */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_CERT_TYPE, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_Type", cert->cert_type); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* add serial node */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_SERIAL, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_Serial", cert->serial); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* set the display icon */ tree_set_node_icon(NULL, node, sslcert_icon); return node; }
int main(void) { //트리를 구성할 루트노드 TreeNode *root=NULL; //트리에 넣을 값들을 받을 정수형 배열 int val[100]; //반복 구문을 수행할 정수형 변수 int i, j; //트리에 구성할 값들을 입력 받기 //설명문 출력 printf("트리를 구성할 값을 입력하세요.\n(정수 범위: 1~100 / 최대 100개 입력 가능 / 종료는 101)\n"); //트리에 넣을 값을 배열에 저장(최대 100번 반복) for(i=0;i<100;i++) { //트리에 넣을 값 입력 scanf("%d", &val[i]); //101를 입력받으면 반복 종료 if(val[i]==101) break; //입력 범위를 초과하면 else if(val[i]>101) //오류 메세지 출력 error("값을 초과하였습니다."); } //입력 값 출력 및 입력 값 트리에 삽입 printf("\n입력 값 \n"); //입력 한 값들의 갯수만큼 반복 for(j=0;j<i;j++) { //입력 값 확인을 위한 출력 printf("%d ", val[j]); //입력 값 트리에 삽입 tree_insert_node(&root, val[j]); } //출력 구분을 위한 개행 printf("\n-------------------------------------------------------\n"); //전위 순회 함수를 통해 전위 순회 출력 printf("전위 순회 출력 결과\n"); tree_preorder(root); //중위 순회 함수를 통해 전위 순회 출력 printf("\n중위 순회 출력 결과\n"); tree_inorder(root); //후위 순회 함수를 통해 전위 순회 출력 printf("\n후위 순회 출력 결과\n"); tree_postorder(root); printf("\n"); //입력 받은 값 트리에서 삭제하기 //설명문 출력 printf("\n트리에서 삭제할 값을 순서대로 입력하세요!(종료는 101) \n"); //트리에서 삭제할 값 배열에 저장(최대 100번 반복) for(i=0;i<100;i++) { //삭제할 값 입력 scanf("%d", &val[i]); //101을 입력받으면 반복 종료 if(val[i]==101) break; //입력 범위를 초과하면 else if(val[i]>101) //오류 메세지 출력 error("값을 초과하였습니다."); } //입력 값 출력 및 입력 값 트리에서 삭제 printf("\n입력 값 \n"); //입력 한 값들의 갯수만큼 반복 for(j=0;j<i;j++) { //삭제 값 확인을 위한 출력 printf("%d ", val[j]); //트리에서 해당되는 노드 삭제 tree_delete_node(&root, val[j]); } //출력 구분을 위한 개행 printf("\n-------------------------------------------------------\n"); //트리 노드 개수 구하는 함수를 통한 개수 출력 printf("삭제 후 트리의 노드 개수 : %d\n", tree_get_node_count(root)); //트리 높이 구하는 함수를 통한 높이 출력 printf("삭제 후 트리의 높이 : %d\n", tree_height(root)); //레벨 순회 함수를 통한 레벨 순회 출력 printf("삭제 후 트리의 레벨 순회 \n"); tree_level_order(root); printf("\n"); system("pause"); return 0; }
BOOL ami_tree_event(struct treeview_window *twin) { /* return TRUE if window destroyed */ ULONG class,result,relevent = 0; ULONG column; uint16 code; struct MenuItem *item; struct node *treenode; struct Node *lbnode; struct node_element *element; char *text; // ULONG editcols[] = {TREE_ELEMENT_TITLE,TREE_ELEMENT_URL}; static WORD gen=0; while((result = RA_HandleInput(twin->objects[OID_MAIN],&code)) != WMHI_LASTMSG) { switch(result & WMHI_CLASSMASK) // class { case WMHI_GADGETUP: switch(result & WMHI_GADGETMASK) { case GID_TREEBROWSER: GetAttrs(twin->gadgets[GID_TREEBROWSER], LISTBROWSER_RelEvent,&relevent, TAG_DONE); switch(relevent) { case LBRE_DOUBLECLICK: GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); GetListBrowserNodeAttrs(lbnode, LBNA_UserData,(ULONG *)&treenode, TAG_DONE); ami_tree_launch_node(twin->tree,treenode); break; case LBRE_EDIT: GetAttrs(twin->gadgets[GID_TREEBROWSER], LISTBROWSER_SelectedNode,(ULONG *)&lbnode, // LISTBROWSER_RelColumn,(ULONG *)&column, TAG_DONE); GetListBrowserNodeAttrs(lbnode, LBNA_UserData,(ULONG *)&treenode, TAG_DONE); element = tree_find_element(treenode,TREE_ELEMENT_TITLE); GetListBrowserNodeAttrs(lbnode, LBNA_Column,column, LBNCA_Text,(ULONG *)&text, TAG_DONE); element->text = (char *)strdup(text); tree_handle_node_element_changed(twin->tree, element); break; case LBRE_HIDECHILDREN: GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); GetListBrowserNodeAttrs(lbnode, LBNA_UserData,(ULONG *)&treenode, TAG_DONE); tree_set_node_expanded(twin->tree, treenode, false); break; case LBRE_SHOWCHILDREN: GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); GetListBrowserNodeAttrs(lbnode, LBNA_UserData,(ULONG *)&treenode, TAG_DONE); tree_set_node_expanded(twin->tree, treenode, true); break; } break; case GID_OPEN: GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); GetListBrowserNodeAttrs(lbnode, LBNA_UserData,(ULONG *)&treenode, TAG_DONE); ami_tree_launch_node(twin->tree,treenode); break; case GID_NEWF: GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); if(lbnode) { GetListBrowserNodeAttrs(lbnode, LBNA_UserData,(ULONG *)&treenode, TAG_DONE); } else { treenode = twin->tree->root; } tree_create_folder_node(treenode,(char *)messages_get("TreeNewFolder")); ami_recreate_listbrowser(twin); break; case GID_NEWB: ami_new_bookmark(twin); break; case GID_UP: ami_move_node(twin,AMI_MOVE_UP); break; case GID_DOWN: ami_move_node(twin,AMI_MOVE_DOWN); break; case GID_LEFT: ami_move_node(twin,AMI_MOVE_OUT); break; case GID_DEL: GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); GetListBrowserNodeAttrs(lbnode, LBNA_UserData,(ULONG *)&treenode, TAG_DONE); tree_delete_node(twin->tree, treenode, false); /* We are recreating the list from scratch as there is no obvious easy way to delete children from a listbrowser list */ ami_recreate_listbrowser(twin); break; } break; /* no menus yet, copied in as will probably need it later case WMHI_MENUPICK: item = ItemAddress(gwin->win->MenuStrip,code); while (code != MENUNULL) { ami_menupick(code,gwin); if(win_destroyed) break; code = item->NextSelect; } break; */ case WMHI_CLOSEWINDOW: ami_tree_close(twin); return TRUE; break; } } return FALSE; }