当前位置:   article > 正文

C++生成二叉搜索树,以及数据的查找,删除和插入_c++二叉排序树的建立、遍历、插入元素、删除元素、查找元素的算法

c++二叉排序树的建立、遍历、插入元素、删除元素、查找元素的算法

一.自己定义的结构体

这个是节点的类,自己定义了一个有参构造。二叉树的左右孩子和当前节点的值。

  1. class Node{
  2. public:
  3. Node(int v) : m_value(v), m_right(nullptr), m_left(nullptr) {};
  4. Node* m_left;
  5. Node* m_right;
  6. int m_value;
  7. };

下面是数的类,包括树的根节点和树的方法的声明

  1. class Tree
  2. {
  3. public:
  4. Tree() :m_root(nullptr) {}
  5. void CreateTree(int* arr, int n) {
  6. CreateTree(arr,n,m_root);
  7. }
  8. void CreateTree(int* arr, int n, Node* root) ;
  9. void InsertBstValue(int v) {}
  10. void InsertBstValue(Node*& root, int v) ;
  11. void search(int v) {
  12. search(m_root,v);
  13. }
  14. Node* search(Node*& root, int v) ;
  15. void del(int v) {
  16. del(m_root,v);
  17. }
  18. void del(Node*& root, int v) ;
  19. Node* Getmin2() {
  20. getmin2(m_root);
  21. }
  22. Node* getmin2(Node* root) ;
  23. void Getmin() {
  24. getmin(m_root);
  25. }
  26. Node* getmin(Node* root) ;
  27. Node* Getmax(){
  28. getmax(m_root);
  29. }
  30. Node* getmax(){};
  31. void postOrder() {
  32. posrOrder(m_root);
  33. }
  34. void postOrder(Node* m_root) ;
  35. private:
  36. Node* m_root;
  37. };

二.对于树类中的函数的实现

1.构造树的函数

  1. void Tree::CreateTree(int *arr,int n,Node* root){
  2. for(int i=0;i<n;i++){
  3. InsertBstValue(arr[i]);
  4. }
  5. }

这个函数会接受数组和数组大小,然后通过多传入的根节点来初始化一棵树。每次插入一个数组元素。

2.对于每个数据的插入

  1. void Tree::InsertBstValue(Node* &root,int v){
  2. if(root== nullptr){
  3. root=new Node(v);
  4. }else {
  5. if (v < root->m_value) {
  6. InsertBstValue(root->m_left, v);
  7. } else {
  8. InsertBstValue(root->m_right, v);
  9. }
  10. }
  11. }

当我们需要插入的时候,我们需要判断当前元素应该所处的位置。到达位置之后,新建节点后插入。

3.对于数据的查找

  1. Node* Tree::search(Node*& root,int v){
  2. if(root!= nullptr){
  3. if(root->m_value<v){
  4. search(root->m_right,v);
  5. }else if(root->m_value>v){
  6. search(root->m_left,v);
  7. }else{
  8. return root;
  9. }
  10. }
  11. return nullptr;
  12. }

因为我们是二叉排序树,我们可以通过类似二分查找的方式,每次遍历当前根节点所在的做或者右子树。找不到的话,返回空。

3.对于数据的删除,我们需要调用find函数。并且传的必须是引用

  1. void Tree::del(int v){
  2. Node* temp = search(m_root,v);
  3. if(temp== nullptr) {
  4. printf("error");
  5. return;
  6. }
  7. del(temp,v);
  8. }
  9. void Tree::del(Node* &root,int v){
  10. if(root!= nullptr){
  11. if(root->m_left!= nullptr&&root->m_right!= nullptr){
  12. Node* temp=root->m_right;
  13. while(temp->m_left){
  14. temp=temp->m_left;
  15. }
  16. m_root->m_value=temp->m_value;
  17. del(temp,0);
  18. }else{
  19. Node* temp=root;
  20. if(root->m_left== nullptr){
  21. root=root->m_right;
  22. }else{
  23. root=root->m_left;
  24. }
  25. }
  26. }
  27. }

4.中序遍历后就是一个从小到大的排序

  1. void Tree::postOrder(){
  2. postOrder(m_root);
  3. }
  4. void Tree::postOrder(Node* m_root){
  5. if(m_root!= nullptr) {
  6. postOrder(m_root->m_left);
  7. cout << m_root->m_value<<" ";
  8. postOrder(m_root->m_right);
  9. }
  10. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/245946
推荐阅读
相关标签
  

闽ICP备14008679号