Implement Binary Search Tree

本文介绍了一种通用的二叉搜索树(BST)的实现方法,包括节点的定义、插入、删除、查找等核心操作,并演示了如何进行前序、中序及后序遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. //BSTree.h
  2. #include<iostream>
  3. using namespace std;
  4. template<typename Elem>
  5. struct BSTNode     //implement BST's node
  6. {
  7.     BSTNode *left,*right;
  8.     Elem data;
  9.     BSTNode(Elem dataVal,BSTNode* leftVal=0,BSTNode* rightVal=0)
  10.     {
  11.         data = dataVal, left = leftVal, right = rightVal;
  12.     }
  13.     BSTNode(BSTNode* leftVal=0,BSTNode* rightVal=0)
  14.     {
  15.         left = leftVal, right = rightVal;
  16.     }
  17.     BSTNode *GetLeft(){return left;}
  18.     BSTNode *GetRight(){return right;}
  19.     Elem GetData(){return data;}
  20.     void SetData(Elem it){data = it;}
  21.     void SetLeft(BSTNode<Elem>*l){left = l;}
  22.     void SetRight(BSTNode<Elem>*r){right = r;}
  23. };
  24. template<typename Elem>
  25. class BSTree       //implement BST
  26. {
  27.     BSTNode<Elem>* root;
  28. public:
  29.     BSTree(Elem it){Init(it);}
  30.     ~BSTree(){DeleteTree(root);}
  31.     void Init(Elem);
  32.     void InsertNode(BSTNode<Elem>*,Elem Item);
  33.     void DeleteTree(BSTNode<Elem>*);
  34.     void PreOrder(BSTNode<Elem>*);
  35.     void InOrder(BSTNode<Elem>*);
  36.     void PostOrder(BSTNode<Elem>*);
  37.     bool Find(BSTNode<Elem>*,Elem);
  38.     BSTNode<Elem>* GetRoot(){return root;}
  39. };
  40. //////////////////////////////////////////////////////////////////////
  41. //BSTree.cpp
  42. #include "BSTree.h"
  43. template<typename Elem>
  44. void BSTree<Elem>::Init(Elem item)
  45. {
  46.     root = new BSTNode<Elem>(item,0,0);
  47. }
  48. template<typename Elem>
  49. void BSTree<Elem>::DeleteTree(BSTNode<Elem>* T)
  50. {
  51.     if (T != NULL)
  52.     {
  53.         DeleteTree(T->GetLeft());
  54.         DeleteTree(T->GetRight());
  55.         delete T;
  56.     }
  57. }
  58. template<typename Elem>
  59. void BSTree<Elem>::InsertNode(BSTNode<Elem>* T,Elem item)
  60. {
  61.     BSTNode<Elem>* p = 0;
  62.     if (T == NULL)
  63.     {
  64.         Init(item);return ;
  65.     }
  66.     else p = T;
  67.     while (1)
  68.     {
  69.         if (p->GetData() == item) return ;
  70.         else if (p->GetData() > item)
  71.         {
  72.             if (p->GetLeft() == NULL)
  73.             {
  74.                 p->left = new BSTNode<Elem>(item,0,0);
  75.                 return ;
  76.             }
  77.             else p = p->left;
  78.         }
  79.         else
  80.         {
  81.             if (p->GetRight() == NULL)
  82.             {
  83.                 p->right = new BSTNode<Elem>(item,0,0);
  84.                 return ;
  85.             }
  86.             else p = p->right;
  87.         }
  88.     }
  89. }
  90. template<typename Elem>
  91. void BSTree<Elem>::PreOrder(BSTNode<Elem>* T)
  92. {
  93.     if (T != NULL)
  94.     {
  95.         cout<<T->GetData()<<" ";
  96.         PreOrder(T->GetLeft());
  97.         PreOrder(T->GetRight());
  98.     }
  99. }
  100. template<typename Elem>
  101. void BSTree<Elem>::InOrder(BSTNode<Elem>* T)
  102. {
  103.     if (T != NULL)
  104.     {
  105.         InOrder(T->left);
  106.         cout<<T->data<<" ";
  107.         InOrder(T->right);
  108.     }
  109. }
  110. template<typename Elem>
  111. void BSTree<Elem>::PostOrder(BSTNode<Elem>* T)
  112. {
  113.     if( T != NULL)
  114.     {
  115.         PostOrder(T->left);
  116.         PostOrder(T->right);
  117.         cout<<T->data<<" ";
  118.     }
  119. }
  120. template<typename Elem>
  121. bool BSTree<Elem>::Find(BSTNode<Elem>* T,Elem item)
  122. {
  123.     if (T == NULL) return false;
  124.     else if (T->GetData() > item) return Find(T->left,item);
  125.     else if (T->GetData() < item) return Find(T->right,item);
  126.     else
  127.     {
  128.         item = T->GetData();
  129.         return true;
  130.     }
  131. }
  132. ////////////////////////////////////////////////////////////
  133. //main.cpp
  134. #include "BSTree.cpp"
  135. int main(void)
  136. {
  137.     BSTree<char> BSt('a');  //root node
  138.     BSTNode<char>* BSn;
  139.     BSn = BSt.GetRoot();
  140.     cout<<"Insert number in the tree,terminted when you type '*'"<<endl;
  141.     char item;
  142.     cin>>item;
  143.     while (item != '*')
  144.     {
  145.         BSt.InsertNode(BSn,item);
  146.         cin>>item;
  147.     }
  148.     cout<<"PreOrder output the tree:"<<endl;
  149.     BSt.PreOrder(BSn);
  150.     cout<<endl<<"Inorder output the tree:"<<endl;
  151.     BSt.InOrder(BSn);
  152.     cout<<endl<<"PostOrder output the tree:"<<endl;
  153.     BSt.PostOrder(BSn);
  154.     char it;
  155.     cin>>it;
  156.     if(BSt.Find(BSn,it)) cout<<"There have the some number in the tree"<<endl;
  157.     else cout<<"No found "<<it<<" in the tree."<<endl;
  158.     return 0;
  159. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值