int main() { struct searchTree * t = initTree(); struct searchTree *root = t = treeInsert(t , 3); treeInsert(t , 8); struct searchTree * x = treeInsert(t , 4); struct searchTree * y = treeInsert(t , 14); treeInsert(t , 9); treeInsert(t , 2); treeInsert(t , 0); treeWalk(t); treeDelete(x); treeWalk(root); treeDelete(y); treeWalk(root); printf("\nmax = %d min = %d \n", treeMax(t) -> k, treeMin(t) -> k); if(treeSearch(t, 3) != NULL) printf("found\n"); printf("%d\n",t -> k); t = treeSuccessor(t); printf("%d\n",t -> k); t = treePredecessor(t); printf("%d\n",t -> k); }
void treeWalk(TreeNode* root, TreeNode*& prv, TreeNode*& first, TreeNode*& second) { //geeksforgeeks上面有相同的一个题目,可以参考,思路一样!,D盘:Tree 中有 //注意参数传递的是指针的引用,如果要改变指针内容,那么需要传入一个二级指针,或一个引用 if(root==NULL) return; treeWalk(root->left,prv,first,second); if((prv!=NULL)&&(prv->val>root->val)){ if(first==NULL) first=prv; second=root; } prv=root; treeWalk(root->right,prv,first,second); }
void recoverTree(TreeNode *root) { TreeNode* first=NULL; TreeNode* second=NULL; TreeNode* prv=NULL; treeWalk(root,prv,first,second); swap(first->val,second->val); }
int main() { struct rbTree* t = treeInit(); struct rbTree *root = t = rbTreeInsert(t , 3); rbTreeInsert(t , 8); struct rbTree * x = rbTreeInsert(t , 4); struct rbTree * y = rbTreeInsert(t , 14); rbTreeInsert(t , 9); rbTreeInsert(t , 2); rbTreeInsert(t , 0); treeWalk(t); // treeWalk(t); // treeDelete(x); // treeWalk(root); // treeDelete(y); // treeWalk(root); // printf("\nmax = %d min = %d \n", treeMax(t) -> k, treeMin(t) -> k); // if(treeSearch(t, 3) != NULL) // printf("found\n"); // printf("%d\n",t -> k); // t = treeSuccessor(t); // printf("%d\n",t -> k); // t = treePredecessor(t); // printf("%d\n",t -> k); }
static Shape treeWalk(Node p) { int i, min_len, max_len; int sep, half_sep, offset; Shape shape; if (p->kids[1]) { Shape shape0 = treeWalk(p->kids[0]); Shape shape1 = treeWalk(p->kids[1]); Shape deeper; min_len = min(shape0->length, shape1->length); sep = 0; for (i = 0; i < min_len; i++) { sep = max(sep, shape0->items[i].right + shape1->items[i].left); } half_sep = sep / 2; max_len = max(shape0->length, shape1->length); shape = new_shape(max_len + 1); for (i = 0; i < min_len; i++) { shape->items[i + 1].left = shape0->items[i].left + half_sep; shape->items[i + 1].right = shape1->items[i].right + half_sep; } if (shape0->length > shape1->length) { deeper = shape0; offset = -half_sep; } else { deeper = shape1; offset = half_sep; } for (i = min_len; i < max_len; i++) { shape->items[i + 1].left = deeper->items[i].left - offset; shape->items[i + 1].right = deeper->items[i].right + offset; } p->kids[0]->x.centre = -half_sep; p->kids[1]->x.centre = half_sep; } else if (p->kids[0]) { Shape kid_shape = treeWalk(p->kids[0]); shape = new_shape(kid_shape->length + 1); for (i = 0; i < kid_shape->length; i++) { shape->items[i + 1] = kid_shape->items[i]; } p->kids[0]->x.centre = 0; } else { shape = new_shape(1); } shape->items[0].left = X_SCALE; shape->items[0].right = X_SCALE; return shape; }
JNIEXPORT jint JNICALL Java_edu_berkeley_bid_CUMACH_treeWalk (JNIEnv *env, jobject obj, jobject jfdata, jobject jinodes, jobject jfnodes, jobject jitrees, jobject jftrees, jobject jvtrees, jobject jctrees, jint nrows, jint ncols, jint ntrees, jint nnodes, jint getcat, jint nbits, jint nlevels) { float *fdata = (float*)getPointer(env, jfdata); int *inodes = (int*)getPointer(env, jinodes); float *fnodes = (float*)getPointer(env, jfnodes); int *itrees = (int*)getPointer(env, jitrees); int *ftrees = (int*)getPointer(env, jftrees); int *vtrees = (int*)getPointer(env, jvtrees); float *ctrees = (float*)getPointer(env, jctrees); return treeWalk(fdata, inodes, fnodes, itrees, ftrees, vtrees, ctrees, nrows, ncols, ntrees, nnodes, getcat, nbits, nlevels); }
static int doTree(Node p, int y) { Shape shape = treeWalk(p); int i, centre; int left = 0; int right = 0; p->x.centre = 0; for (i = 0; i < shape->length; i++) { left = max(left, shape->items[i].left); right = max(right, shape->items[i].right); } centre = (left - right)/2; drawLines(p, centre, y); drawNodes(p, centre, y); return y + shape->length * Y_SCALE + Y_SPACING; }