这样吧。。

This commit is contained in:
iridiumR 2021-12-17 16:38:06 +08:00
parent c547c71d05
commit 9b43dd8f88
4 changed files with 93 additions and 257 deletions

View file

@ -1,228 +0,0 @@
#include "bintree.hpp"
#include "stack.hpp"
#include <iostream>
#include <string>
#include <time.h>
#include <cmath>
class BST : binTree<int>
{
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<binNodeArray(int)> *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<binNodeArray(int)> 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<binNodeArray(int)> 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<binNodeArray(int)> 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;
}
};

View file

@ -1,4 +1,4 @@
#include "BST.hpp" #include "../ex9/BST.hpp"
#include <iostream> #include <iostream>
int main() int main()

View file

@ -1,9 +1,9 @@
#include "bintree.hpp" #include "bintree.hpp"
#include "stack.hpp" #include "stack.hpp"
#include <cmath>
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <time.h> #include <time.h>
#include <cmath>
class BST : binTree<int> class BST : binTree<int>
{ {
@ -13,7 +13,6 @@ private:
public: public:
~BST() ~BST()
{ {
} }
BST(int num) BST(int num)
{ {
@ -125,29 +124,37 @@ public:
void search_best(int target) void search_best(int target)
{ {
Queue<binNodeArray(int)> q; binNodeArray(int) node = root();
int old_data = 0;
int minus = 1440; Stack<binNodeArray(int)> S;
binNodeArray(int) target_p; while (1)
q.enqueue(root());
while (!q.empty())
{ {
binNodeArray(int) node = q.dequeue(); gotoLeftEnd(node, S);
if (S.empty())
if(minus>abs(target-node->data)) break;
node = S.pop();
if (target > old_data && target <= node->data)
{ {
minus = abs(target - node->data); if (abs(old_data - target) < abs(node->data - target))
target_p = node; {
// std::cout << node->pos;
printf("%02d:%02d \n", old_data / 60, old_data % 60);
}
else
{
// std::cout << node->pos;
printf("%02d:%02d \n", node->data / 60, node->data % 60);
}
return;
} }
if (hasLC(node)) old_data = node->data;
q.enqueue(node->lc);
if (hasRC(node)) node = node->rc;
q.enqueue(node->rc);
} }
std::cout << target_p->pos; printf("未找到\n");
printf("-%02d:%02d \n", target_p->data / 60, target_p->data % 60);
} }
//先序遍历 //先序遍历
@ -174,11 +181,24 @@ protected:
if (!node) if (!node)
return; return;
std::cout << node->pos; Stack<binNodeArray(int)> S;
printf("-%02d:%02d \n", node->data / 60, node->data % 60); while (1)
{
pre(node->lc); visitAlongL(node, S);
pre(node->rc); if (S.empty())
break;
node = S.pop();
}
}
void visitAlongL(binNodeArray(int) x, Stack<binNodeArray(int)> &S)
{
while (x)
{
std::cout << x->pos;
printf("-%02d:%02d \n", x->data / 60, x->data % 60);
S.push(x->rc);
x = x->lc;
}
} }
void post(binNodeArray(int) node) void post(binNodeArray(int) node)
@ -197,12 +217,29 @@ protected:
{ {
if (!node) if (!node)
return; return;
Stack<binNodeArray(int)> S;
while (1)
{
gotoLeftEnd(node, S);
pre(node->lc); if (S.empty())
break;
node = S.pop();
std::cout << node->pos; std::cout << node->pos;
printf("-%02d:%02d \n", node->data / 60, node->data % 60); printf("-%02d:%02d \n", node->data / 60, node->data % 60);
pre(node->rc);
node = node->rc;
}
}
void gotoLeftEnd(binNodeArray(int) x, Stack<binNodeArray(int)> &S)
{
while (x)
{
S.push(x);
x = x->lc;
}
} }
public: public:
@ -225,4 +262,29 @@ public:
return depth; return depth;
} }
binNodeArray(int) find_ans(binNodeArray(int) a, binNodeArray(int) b)
{
binNodeArray(int) ans = a;
binNodeArray(int) node;
while (ans)
{
node = ans;
Stack<binNodeArray(int)> S;
while (1)
{
gotoLeftEnd(node, S);
if (S.empty())
break;
node = S.pop();
if(node==b)
return ans;
node = node->rc;
}
ans = ans->parent;
}
return NULL;
}
}; };

View file

@ -20,5 +20,7 @@ int main()
printf("高度为%d\n",bst.height()); printf("高度为%d\n",bst.height());
return 0; return 0;
} }