#include "bintree.hpp" #include "stack.hpp" #include #include #include #include class BST : binTree { private: binNodeArray(int) p; public: ~BST() { } BST(int num) { srand(time(NULL)); int temp = rand() % 1440; _root->data = temp; _root->pos = "root"; std::cout << _root->pos; printf("-%02d:%02d \n", temp / 60, temp % 60); for (int i = 0; i < num - 1; i++) { temp = rand() % 1440; p = root(); std::string position; while (temp != -1) { if (temp < (p->data)) { if (hasLC(p)) { p = p->lc; position.append("0"); } else { position.append("0"); addLC(p, temp); p->lc->pos = position; std::cout << position; printf("-%02d:%02d \n", temp / 60, temp % 60); temp = -1; } } else if (temp > (p->data)) { if (hasRC(p)) { p = p->rc; position.append("1"); } else { position.append("1"); addRC(p, temp); p->rc->pos = position; std::cout << position; printf("-%02d:%02d \n", temp / 60, temp % 60); temp = -1; } } else { i--; temp = -1; } } } } bool searchPath(binNodeArray(int) root, binNodeArray(int) target, Stack *s) { if (root == NULL) return false; s->push(root); if (root->data == target->data) return true; bool flag = false; //先去左子树找 if (root->lc != NULL) flag = searchPath(root->lc, target, s); //左子树找不到并且右子树不为空的情况下才去找 if (!flag && root->rc != NULL) flag = searchPath(root->rc, target, s); //左右都找不到,弹出栈顶元素 if (!flag) s->pop(); return flag; } //层次遍历 void trav_level() { Queue q; int depth = 0; int old_depth = 0; q.enqueue(root()); while (!q.empty()) { binNodeArray(int) node = q.dequeue(); old_depth = depth; depth = node->pos.size(); if (old_depth != depth) printf("\n"); // std::cout << node->pos; printf("%02d:%02d ", node->data / 60, node->data % 60); if (hasLC(node)) q.enqueue(node->lc); if (hasRC(node)) q.enqueue(node->rc); } } void search_best(int target) { Queue q; int minus = 1440; binNodeArray(int) target_p; q.enqueue(root()); while (!q.empty()) { binNodeArray(int) node = q.dequeue(); if(minus>abs(target-node->data)) { minus = abs(target - node->data); target_p = node; } if (hasLC(node)) q.enqueue(node->lc); if (hasRC(node)) q.enqueue(node->rc); } std::cout << target_p->pos; printf("-%02d:%02d \n", target_p->data / 60, target_p->data % 60); } //先序遍历 void trav_pre() { pre(root()); } //后序遍历 void trav_post() { post(root()); } //中序遍历 void trav_in() { in(root()); } protected: void pre(binNodeArray(int) node) { if (!node) return; std::cout << node->pos; printf("-%02d:%02d \n", node->data / 60, node->data % 60); pre(node->lc); pre(node->rc); } void post(binNodeArray(int) node) { if (!node) return; pre(node->lc); pre(node->rc); std::cout << node->pos; printf("-%02d:%02d \n", node->data / 60, node->data % 60); } void in(binNodeArray(int) node) { if (!node) return; pre(node->lc); std::cout << node->pos; printf("-%02d:%02d \n", node->data / 60, node->data % 60); pre(node->rc); } public: int height() { Queue q; q.enqueue(root()); int depth; while (!q.empty()) { binNodeArray(int) node = q.dequeue(); depth = node->pos.size(); if (hasLC(node)) q.enqueue(node->lc); if (hasRC(node)) q.enqueue(node->rc); } return depth; } };