/* Join at the specified components, returning new root */ static stTree *joinAtNodes(stTree *root1, stTree *node1, stTree *root2, stTree *node2, struct malnCompCompMap *srcDestCompMap) { if ((stTree_getParent(node1) == NULL) && (stTree_getParent(node2) == NULL)) { assert((root1 == node1) && (root2 == node2)); return joinTrees(root1, node1, node2, srcDestCompMap); } else if (stTree_getParent(node1) == NULL) { assert(root1 == node1); return joinTrees(root2, node2, node1, srcDestCompMap); } else if (stTree_getParent(node2) == NULL) { assert(root2 == node2); return joinTrees(root1, node1, node2, srcDestCompMap); } else { errAbort("join nodes don't obey rules: node1: %s node2: %s", stTree_getLabel(node1), stTree_getLabel(node2)); return NULL; } }
TreeNode deleteWithJoin(TreeNode t, int value) { TreeNode n; if (t == NULL) { return NULL; } if (value < t->value){ t = deleteWithJoin(t->leftnode, value); } else if (value > t->value){ t = deleteWithJoin(t->rightnode, value); } else{ // t->value == value if (t->leftnode == NULL){ n = t->rightnode; } else if (t->rightnode == NULL){ n = t->leftnode; } else{ n = joinTrees(t->leftnode, t->rightnode); } free(t); t = n; } return t; }