node_t * init_char_node(char c, unsigned int cnt) { char_count * data; data = malloc(sizeof *data); data->c = c; data->cnt = cnt; return tree_init_node(data); }
int main(void) { int _data[] = {1,2,3,4,5,6,7,8,9}; int * data = _data; tree_t * tree = tree_init(); node_t * node1 = tree_init_node(data+0); node_t * node2 = tree_init_node(data+1); node_t * node3 = tree_init_node(data+2); node_t * node4 = tree_init_node(data+3); node_t * node5 = tree_init_node(data+4); node_t * node6 = tree_init_node(data+5); node_t * node7 = tree_init_node(data+6); node_t * node8 = tree_init_node(data+7); node_t * node9 = tree_init_node(data+8); tree->root = node5; node5->left = node2; node2->left = node1; node2->right = node3; node3->right = node4; node5->right = node8; node8->left = node7; node7->left = node6; node8->right = node9; /* uh what if ... one of the nodes is an ancestor*/ int tests[6][3] = { {6,9,8}, {1,4,2}, {5,6,5}, {5,5,5}, {1,1,1}, {1,9,5} }; int c; int ret; for (int i = 0; i < 6; ++i) { ret = lca(tree, tests[i][0], tests[i][1], &c) ; if ( ret != 0 ) { printf("lca(%d,%d) returned %d\n", tests[i][0], tests[i][1], ret); return -1; } else if ( c != tests[i][2] ) { printf("lca(%d,%d) != %d\n",tests[i][0], tests[i][1], tests[i][2]); return -1; } } return 0; }
//前序构建二叉树 void tree_create_preamble(s_node *p_node, int left_right, s_node **node, void ***p) { if (p == null) { return; } //遇到空指针返回 if (**p == null) { return; } //创建新节点 *node = (s_node *) malloc(sizeof(s_node)); tree_init_node(*node, **p); //设置父节点 (*node)->parent = p_node; if (p_node != null) { //设置父节点的左孩子 if (left_right == 0) { p_node->left_child = *node; } //设置父节点的右孩子 else if (left_right == 1) { p_node->right_child = *node; } } //下一个数据地址 (*p)++; //构建左子树 tree_create_preamble(*node, 0, &((*node)->left_child), p); //下一个数据地址 (*p)++; //构建右子树 tree_create_preamble(*node, 1, &((*node)->right_child), p); }