BST:二叉排序树算法

5 篇文章 0 订阅
      建立二叉排序树,实现树的插入、删除,前、中、后序遍历(递归方式)等操作。

  1. #include <iostream>  
  2. #include "Binary_Tree.h"  
  3.   
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.     int N = 0;  
  9.     int *data;  
  10.     cout << "N = ";  
  11.     cin >> N;  
  12.     data = (int *)malloc(N * sizeof(int));  
  13.     cout << "数据:";  
  14.     for (int i = 0; i < N; ++i)  
  15.     {  
  16.         cin >> data[i];  
  17.     }  
  18.     //30 12 54 8 24 35 70 19 28 48  
  19.     //30 12 54 24 35 70 19 28 48 37 36 38  
  20.     BT BTree;  
  21.     BTree.Create_Binary_Sort_Tree(data, N);  
  22.     while(1)  
  23.     {  
  24.         cout << "1.遍历\t2.插入\t3.删除\t4.退出"<<endl;  
  25.         cout <<"选择:";  
  26.         int choice;  
  27.         cin >> choice;  
  28.         switch(choice)  
  29.         {  
  30.             case 1:  
  31.                 cout << "前序:";  
  32.                 BTree.Pre_Oder_Traverse(BTree.root);  
  33.                 cout << endl;  
  34.                 cout << "中序:";  
  35.                 BTree.In_Oder_Traverse(BTree.root);  
  36.                 cout << endl;  
  37.                 cout << "后序:";  
  38.                 BTree.Post_Oder_Traverse(BTree.root);  
  39.                 cout << endl;  
  40.                 break;  
  41.             case 2:  
  42.                 cout << "插入:";  
  43.                 int value;  
  44.                 cin >> value;  
  45.                 BTree.Insert_Elem(value);  
  46.                 break;  
  47.             case 3:  
  48.                 cout << "删除:";  
  49.                 cin >> value;  
  50.                 BTree.Delete_Elem(value);  
  51.                 break;  
  52.             case 4:  
  53.                 return 0;  
  54.                 break;  
  55.             default:  
  56.                 break;  
  57.         }  
  58.     }  
  59.     return 0;  
  60. }  
  1. /*****************************************    
  2. Copyright (c) 2015 Jingshuang Hu    
  3.     
  4. @filename:Binary_Tree.h    
  5. @datetime:2015.11.03    
  6. @author:HJS    
  7. @e-mail:eleftheria@163.com    
  8. @blog:http://blog.csdn.net/hujingshuang    
  9. *****************************************/  
  10. #ifndef _BINARY_TREE_H_  
  11. #define _BINARY_TREE_H_  
  12.   
  13. #include <iostream>  
  14.   
  15. using namespace std;  
  16.   
  17. struct Tree  
  18. {  
  19.     int elem;  
  20.     Tree *left;  
  21.     Tree *right;  
  22. };  
  23.   
  24. class BT  
  25. {  
  26. public:  
  27.     BT();                                           //构造函数  
  28.     void Create_Binary_Sort_Tree(int *, int);       //建立二叉树  
  29.     void Pre_Oder_Traverse(Tree *);                 //前序  
  30.     void In_Oder_Traverse(Tree *);                  //中序  
  31.     void Post_Oder_Traverse(Tree *);                //后序  
  32.     void Insert_Elem(int);                          //插入  
  33.     void Delete_Elem(int);                          //删除  
  34. //  void Show_Tree(void);                           //显示二叉树  
  35. //  virtual void Level_Oder_Traverse(Tree *) = 0;   //纯虚函数  
  36. //private:  
  37.     Tree *root;  
  38. };  
  39.   
  40. #endif  
  1. /*****************************************    
  2. Copyright (c) 2015 Jingshuang Hu    
  3.     
  4. @filename:Binary_Tree.cpp    
  5. @datetime:2015.11.03    
  6. @author:HJS    
  7. @e-mail:eleftheria@163.com    
  8. @blog:http://blog.csdn.net/hujingshuang    
  9. *****************************************/  
  10. #include "Binary_Tree.h"  
  11.   
  12. //初始化二叉树  
  13. BT::BT()  
  14. {  
  15.     root = NULL;  
  16. }  
  17. //建立二叉树  
  18. void BT::Create_Binary_Sort_Tree(int *data, int N)  
  19. {  
  20.     Tree *nowfreenode = new Tree;                   //生成新的节点  
  21.     Tree *prefreenode = new Tree;  
  22.     root = new Tree;  
  23.     root->elem = data[0];                            //父节点元素  
  24.     root->left = root->right = NULL;              //左右孩子为空  
  25. //30 12 54 8 24 35 70 19 28 48  
  26.     for (int i = 1; i < N; ++i)  
  27.     {  
  28.         nowfreenode = root;  
  29.         Tree *newnode = new Tree;                   //生成新的节点  
  30.         newnode->elem = data[i];  
  31.         newnode->left = newnode->right = NULL;  
  32.   
  33.         while(nowfreenode != NULL)                  //空  
  34.         {  
  35.             prefreenode = nowfreenode;              //用于记录前一个节点  
  36.             if (newnode->elem < nowfreenode->elem) //挂在左边  
  37.             {  
  38.                 nowfreenode = nowfreenode->left;  
  39.             }  
  40.             else  
  41.             {  
  42.                 nowfreenode = nowfreenode->right;    //挂在右边  
  43.             }   
  44.         }  
  45.         if (newnode->elem < prefreenode->elem)  
  46.         {  
  47.             prefreenode->left = newnode;  
  48.         }  
  49.         else  
  50.         {  
  51.             prefreenode->right = newnode;  
  52.         }  
  53.     }  
  54.     delete nowfreenode;  
  55. //  delete prefreenode;  
  56. }  
  57. //前序  
  58. void BT::Pre_Oder_Traverse(Tree *T)  
  59. {  
  60.     if (T != NULL)  
  61.     {  
  62.         cout << T->elem << " ";  
  63.         Pre_Oder_Traverse(T->left);  
  64.         Pre_Oder_Traverse(T->right);  
  65.     }  
  66. }  
  67. //中序  
  68. void BT::In_Oder_Traverse(Tree *T)  
  69. {  
  70.     if (T != NULL)  
  71.     {  
  72.         In_Oder_Traverse(T->left);  
  73.         cout << T->elem << " ";   
  74.         In_Oder_Traverse(T->right);  
  75.     }  
  76. }  
  77. //后序  
  78. void BT::Post_Oder_Traverse(Tree *T)  
  79. {  
  80.     if (T != NULL)  
  81.     {  
  82.         Post_Oder_Traverse(T->left);  
  83.         Post_Oder_Traverse(T->right);  
  84.         cout << T->elem << " ";  
  85.     }  
  86. }  
  87. //插入  
  88. void BT::Insert_Elem(int data)  
  89. {  
  90.     Tree *nowfreenode = new Tree;  
  91.     Tree *prefreenode = new Tree;  
  92.     nowfreenode = root;  
  93.     Tree *newnode = new Tree;                   //生成新的节点  
  94.     newnode->elem = data;  
  95.     newnode->left = newnode->right = NULL;  
  96.     while(nowfreenode != NULL)                  //空  
  97.     {  
  98.         prefreenode = nowfreenode;              //用于记录前一个节点  
  99.         if (newnode->elem < nowfreenode->elem) //挂在左边  
  100.         {  
  101.             nowfreenode = nowfreenode->left;  
  102.         }  
  103.         else  
  104.         {  
  105.             nowfreenode = nowfreenode->right;    //挂在右边  
  106.         }   
  107.     }  
  108.     if (newnode->elem < prefreenode->elem)  
  109.     {  
  110.         prefreenode->left = newnode;  
  111.     }  
  112.     else  
  113.     {  
  114.         prefreenode->right = newnode;  
  115.     }  
  116. }  
  117. //删除  
  118. void BT::Delete_Elem(int data)  
  119. {  
  120.     Tree *prefreenode = new Tree;  
  121.     Tree *nowfreenode = new Tree;  
  122.     nowfreenode = root;  
  123.   
  124.     Tree *newnode = new Tree;  
  125.     newnode->elem = data;  
  126.     newnode->left = newnode->right = NULL;  
  127.     prefreenode = nowfreenode;  
  128.     //找到元素所在节点nowfreenode  
  129.     while((nowfreenode != NULL) && (newnode->elem != nowfreenode->elem))  
  130.     {  
  131.         prefreenode = nowfreenode;  
  132.         if (newnode->elem < nowfreenode->elem)     //往左走  
  133.         {  
  134.             nowfreenode = nowfreenode->left;  
  135.         }  
  136.         else if (newnode->elem > nowfreenode->elem)    //往右走  
  137.         {  
  138.             nowfreenode = nowfreenode->right;  
  139.         }  
  140.     }  
  141. //  
  142.     if ((nowfreenode->left != NULL) && (nowfreenode->right == NULL))//只有左子树,用左子树代替节点  
  143.     {     
  144.         if ((prefreenode->left != NULL) && (prefreenode->left->elem == nowfreenode->elem))  
  145.         {  
  146.             prefreenode->left = nowfreenode->left;  
  147.         }  
  148.         else  
  149.         {  
  150.             if (prefreenode == nowfreenode)  
  151.             {  
  152.                 root = nowfreenode->left;  
  153.             }  
  154.             else  
  155.             {  
  156.                 prefreenode->right = nowfreenode->left;  
  157.             }  
  158.         }  
  159.     }  
  160.     else if ((nowfreenode->left == NULL) && (nowfreenode->right != NULL))//只有右子树,用右子树代替节点  
  161.     {  
  162.         if ((prefreenode->left != NULL) && (prefreenode->left->elem == nowfreenode->elem))  
  163.         {  
  164.             prefreenode->left = nowfreenode->right;  
  165.         }  
  166.         else  
  167.         {  
  168.             if (prefreenode == nowfreenode)  
  169.             {  
  170.                 root = nowfreenode->right;  
  171.             }  
  172.             else  
  173.             {  
  174.                 prefreenode->right = nowfreenode->right;  
  175.             }  
  176.         }  
  177.     }  
  178.     else if ((nowfreenode->left == NULL) && (nowfreenode->right == NULL))//是叶子节点,直接删除  
  179.     {  
  180.         if ((prefreenode->left != NULL) && (prefreenode->left->elem == nowfreenode->elem))  
  181.             prefreenode->left = NULL;  
  182.         else  
  183.             prefreenode->right = NULL;  
  184.     }  
  185.     else//左右子树都存在,用左子树最右节点代替节点  
  186.     {  
  187.         prefreenode = nowfreenode;  
  188.         nowfreenode = nowfreenode->left;  
  189.         Tree *pfreenode = prefreenode;  
  190.         while(nowfreenode->right != NULL)  
  191.         {  
  192.             pfreenode = nowfreenode;  
  193.             nowfreenode = nowfreenode->right;  
  194.         }  
  195.         prefreenode->elem = nowfreenode->elem;  
  196.         pfreenode->right = nowfreenode->left;  
  197.         delete prefreenode;  
  198.     }  
  199. //  delete nowfreenode;  

本文来自:http://blog.csdn.net/hujingshuang/article/details/49679991
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值