BTree2.C
上传用户:zjanan02
上传日期:2007-01-07
资源大小:1k
文件大小:2k
开发平台:

C/C++

  1. #include "BTree.h"
  2. #include <stdlib.h>
  3. BTree::BTree()
  4. {
  5.   root=NULL;
  6. }
  7. BTree::~BTree()
  8. {
  9.   DestructTree(root);
  10. }
  11. void BTree::DestructTree(node* r)
  12. {
  13.   if (r!=NULL)
  14.     {
  15.       DestructTree(r->left); DestructTree(r->right);
  16.       delete r;
  17.     }
  18. }
  19. void BTree::Insert(int elem)
  20. {
  21.   InsertInTree(elem, root);
  22. }
  23. void BTree::InsertInTree(int x, node *&p)
  24. {
  25.   if (p==NULL) // leaf, create new node
  26.     {
  27.       p=new node; 
  28.       p->val=x; p->left=NULL; p->right=NULL; 
  29.     }
  30.   else if (p->val>x)
  31.     {
  32.       InsertInTree(x, p->left);
  33.     }
  34.   else if (p->val<x)
  35.     {
  36.       InsertInTree(x, p->right);  
  37.     }
  38.   else
  39.     {
  40.     // element already in tree, do nothing
  41.     }
  42. }
  43. void BTree::Delete(int elem)
  44. {
  45.   DeleteFromTree(elem, root);
  46. }
  47. void BTree::Del(node *&r, node *&q)
  48. {
  49.   if (r->right!=NULL)
  50.     {
  51.       Del(r->right, q);
  52.     }
  53.   else
  54.     {
  55.       q->val=r->val; q=r; r=r->left; 
  56.     }
  57. }
  58. void BTree::DeleteFromTree(int x, node *&p)
  59. {
  60.   node *q;
  61.   
  62.   if (p==NULL) {} // key not found!
  63.   else if (p->val>x)
  64.     {
  65.       DeleteFromTree(x, p->left);
  66.     }
  67.   else if (p->val<x)
  68.     {
  69.       DeleteFromTree(x, p->right);
  70.     }
  71.   else  //p->val==x; remove
  72.     {
  73.       q=p;
  74.       if (q->right==NULL)
  75. {
  76.   p=q->left; 
  77. }
  78.       else if (q->left==NULL)
  79. {
  80.   p=q->right; 
  81. }
  82.       else
  83. {
  84.   Del(q->left, q);
  85. }
  86.       delete q;
  87.     }
  88. }
  89. bool BTree::Find(int z)
  90. {
  91.   return FindInTree(z, root);
  92. }
  93. bool BTree::FindInTree(int z, node *&p)
  94. {
  95.   while (p != NULL)
  96.       if (z < p->val)
  97.   p = p->left;
  98.       else
  99. if (z > p->val)
  100.     p = p->right;
  101.       else
  102. return true;
  103.       
  104.   return false;
  105. }
  106. int BTree::Max(const int a, const int b)
  107. {
  108.   if(a < b)
  109.     return b;
  110.   else
  111.     return a;
  112. }
  113. int BTree::Height()
  114. {
  115.   HeightInTree(root);
  116. }
  117. int BTree::HeightInTree(const node *T)
  118. {
  119.   if (T == NULL)
  120.     return -1;
  121.   else 
  122.     return 1 + Max(HeightInTree(T->left), HeightInTree(T->right));
  123. }
  124.       
  125. int BTree::Size(const node*T)
  126. {
  127.   if (T == NULL)
  128.     return 0;
  129.   else 
  130.     return 1 + Size(T->left) + Size(T->right);
  131. }
  132. int BTree::Leaves(const node *T)
  133. {
  134.   if (T == NULL)
  135.     return 1;
  136.   else
  137.     return Leaves(T->left) + Leaves(T->right);
  138. }
  139.       
  140. double BTree::AvDepth()
  141. {
  142.   return Size(root)/Leaves(root);
  143. }
  144. void BTree::PrintInTree(node *&T)
  145. {
  146.   if (T != NULL)
  147.     {
  148.       cout << T->val<< endl;
  149.       PrintInTree(T->left);
  150.       PrintInTree(T->right);
  151.     }
  152. }
  153. void BTree::Print()
  154. {
  155.   PrintInTree(root);
  156. }