tree.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. class btnode
  4. {
  5. protected :
  6. btnode *Left, *Right;
  7. public :
  8. btnode *left() { return Left; }
  9. btnode *right() { return Right; }
  10. void set_right(btnode *right) { Right=right; }
  11. void set_left (btnode *left) { Left=left; }
  12. virtual int compare (btnode *node) = 0;
  13. virtual char *name () = 0;
  14. } ;
  15. class btree
  16. {
  17. void reprint(btnode *n);
  18. protected :
  19. btnode *root;
  20. public :
  21. btree() { root=NULL; }
  22. virtual void insert(btnode *node);
  23. virtual void remove(btnode *node);
  24. void print() { reprint(root); }
  25. } ;
  26. void btree::insert(btnode *node)
  27. { btnode *parent,*finder;
  28. int from_left;
  29. node->set_right(NULL); node->set_left(NULL);
  30. if (root)
  31. { finder=root;
  32. while (finder)
  33. { parent=finder;
  34. if (finder->compare(node)>0)
  35. { from_left=1; finder=finder->left(); }
  36. else
  37. { from_left=0; finder=finder->right(); }
  38. }
  39. if (from_left)
  40. parent->set_left(node);
  41. else
  42. parent->set_right(node);
  43. } else root=node;
  44. }
  45. void btree::remove(btnode *node)
  46. {
  47. }
  48. void btree::reprint(btnode *n)
  49. {
  50. if (n)
  51. { reprint(n->left());
  52. printf("%s\n",n->name());
  53. reprint(n->right());
  54. }
  55. }
  56. class btnumber : public btnode
  57. {
  58. int num;
  59. public :
  60. btnumber(int x) { num=x; }
  61. virtual int compare (btnode *node)
  62. { if (num<((btnumber *)node)->num) return -1;
  63. else return (num> ((btnumber *)node)->num); }
  64. virtual char *name ()
  65. { static char st[20]; sprintf(st,"%d",num); return st;}
  66. } ;
  67. main()
  68. {
  69. btree bt;
  70. for (int i=0;i<20;i++)
  71. bt.insert((btnode *) new btnumber(random(500)));
  72. bt.print();