代码如下:

#include <iostream>
using namespace std;class BSTNode {private:double key;BSTNode *lchild;BSTNode *rchild;BSTNode *parent;friend class BSTree;public:BSTNode(double k = 0.0, BSTNode *l = nullptr, BSTNode *r = nullptr, BSTNode *p = nullptr): key(k), lchild(l), rchild(r), parent(p) {}
};class BSTree
{private:BSTNode *root;void inorder_tree_walk(BSTNode *t) {if (t != nullptr) {inorder_tree_walk(t->lchild);cout << t->key << " ";inorder_tree_walk(t->rchild);}
}void preorder_tree_walk(BSTNode *t) {if (t != nullptr) {cout << t->key << " ";preorder_tree_walk(t->lchild);preorder_tree_walk(t->rchild);}
}void postorder_tree_walk(BSTNode *t) {if(t!=nullptr){postorder_tree_walk(t->lchild);postorder_tree_walk(t->rchild);cout << t->key << " ";
}
}BSTNode *tree_search_one(BSTNode *t, double k) {if (t == nullptr || k == t->key)return t;if (k < t->key)return    tree_search_one(t->lchild,k);elsereturn tree_search_one(t->rchild,k);
}BSTNode *tree_search_two(BSTNode *t,double k)
{while(t!=nullptr && k!=t->key){if (k < t->key)t = t->lchild;else t = t->rchild;}return t;
}BSTNode *tree_min(BSTNode *t)
{while(t->lchild!=nullptr)t = t->lchild;return t;
}BSTNode *tree_max(BSTNode *t)
{while(t->rchild!=nullptr)t = t->rchild;return t;
}BSTNode *tree_successor(BSTNode *t)
{BSTNode *y;if (t->rchild!=nullptr) return tree_min(t->rchild);y = t->parent;while(y!=nullptr && t==y->rchild){t = y;y = y->parent;}return y;
}BSTNode *tree_predecessor(BSTNode *t)
{BSTNode *y;y = t->parent;if (t->lchild!=nullptr) return tree_max(t->lchild);while(y!=nullptr && t==y->lchild){t = y;y = y->parent;}return y;
}void tree_insert(BSTNode *&t,BSTNode *z)
{BSTNode *x = t;BSTNode *y = nullptr;while(x!=nullptr){y = x;if (z->key < x->key) x = x->lchild;else x = x->rchild;}z->parent = y;if (y==nullptr) t = z;else if (z->key < y->key) y->lchild = z;else y->rchild = z;
}void transplant(BSTNode *&t,BSTNode *u,BSTNode *v)
{if (u->parent==nullptr) t = v;else if (u->parent->lchild==u) u->parent->lchild = v;else u->parent->rchild = v;if (v!=nullptr) v->parent = u->parent;
}BSTNode *tree_delete(BSTNode *&t,BSTNode *z)
{BSTNode *y = nullptr;if(z->lchild==nullptr) transplant(t,z,z->rchild);else if (z->rchild==nullptr) transplant(t,z,z->lchild);else{y = tree_min(z->rchild);if (y->parent!=z){transplant(t,y,y->rchild);y->rchild = z->rchild;y->rchild->parent = y;}transplant(t,z,y);y->lchild = z->lchild;y->lchild->parent = y;}return z;
}void tree_destory(BSTNode *&t){if(t==nullptr) return ;if (t->lchild!=nullptr) return tree_destory(t->lchild);if (t->rchild!=nullptr) return tree_destory(t->rchild);delete t;t = nullptr;}public:BSTree():root(nullptr){}void PreOrder_Tree_Walk(){preorder_tree_walk(root);cout<<endl;}void InOrder_Tree_Walk(){inorder_tree_walk(root);cout<<endl;}void PostOrder_Tree_Walk(){postorder_tree_walk(root);cout<<endl;}BSTNode *Tree_Search(double key){return tree_search_one(root,key);}BSTNode *Iterative_Tree_Search(double key){return tree_search_two(root,key);}BSTNode* Tree_Minimum(BSTNode *x){return tree_min(x);             }BSTNode* Tree_Maximum(BSTNode *x){return tree_max(x);                  }BSTNode *Tree_Successor(BSTNode *x){return tree_successor(x);}BSTNode *Tree_Predecessor(BSTNode *x){return tree_predecessor(x);}void Tree_Insert(double key){BSTNode *z = new BSTNode(key,nullptr,nullptr,nullptr);if (z==nullptr) return ;tree_insert(root,z); }void Tree_Delete(double key){BSTNode *z,*node;z = tree_search_two(root,key);if (z!=nullptr){node = tree_delete(root,z);if (node !=nullptr){delete node;node = nullptr;}}}void Tree_Destory(){tree_destory(root);}~BSTree(){Tree_Destory();}
};int main()
{int i,j,n;double *arr;BSTree *tree = new BSTree();cout<<"请输入节点/关键字个数:"<<endl;cin>>n;arr = new double[n];cout<<"请依次输入关键字(注意每棵子树的根节点都要比它的孩子结点先输入): "<<endl;for (int i = 0;i<n;i++){cin>>arr[i];tree->Tree_Insert(arr[i]);}cout<<endl;cout << "二叉搜索树先序遍历的结果为: ";tree->PreOrder_Tree_Walk();cout << "二叉搜索树中序遍历的结果为: ";tree->InOrder_Tree_Walk();cout << "二叉搜索树后序遍历的结果为: ";tree->PostOrder_Tree_Walk();cout << endl;double seakey;cout<<"请输入要查找的节点关键字:"<<endl;cin>>seakey;BSTNode *seaNode  = tree->Tree_Search(seakey);if (seaNode) cout<<"查找成功!"<<endl;else         cout << "查找失败, 关键字为" << seakey << "的结点不存在" << endl;cout<<endl;double delkey;cout << "请输入要删除的结点关键字: " << endl;cin >> delkey;tree->Tree_Delete(delkey);// 通过先序与中序遍历,或者中序与后序遍历可以唯一确定一棵二叉树// 因此此处可以验证删除后的二叉搜索树是否与你预想的一样cout << "删除操作后先序遍历二叉搜索树的结果为: ";tree->PreOrder_Tree_Walk();cout << "删除操作后中序遍历二叉搜索树的结果为: ";tree->InOrder_Tree_Walk();cout << endl;tree->Tree_Destory();             // 销毁二叉树delete[] arr;system("pause");return 0;
}

测试结果:



参考于:
https://blog.csdn.net/qq_21396469/article/details/78419609

C++ class类 实现搜索二叉树(BST)相关推荐

  1. C++ struct结构体 实现搜索二叉树(BST)

    代码如下: #include <iostream> using namespace std;struct BSTNode {double v = 0.0;BSTNode *lc = nul ...

  2. C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)

    目录 题目一 二叉树递归和非递归遍历 题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度) 题目四 如何判断一棵二叉树是搜索二叉树(BST)? 题目四 如何判断一棵二叉树是平衡 ...

  3. Java实现BST:搜索二叉树

    文章目录 数据结构的定义 非递归增加节点 递归增加节点 非递归删除节点 递归删除节点 非递归搜索 递归搜索 先序遍历-递归 中序遍历-递归 后序遍历-递归 先序遍历-非递归 中序遍历-非递归 后序遍历 ...

  4. 左神算法:将搜索二叉树转换成双向链表(Java版)

    本题来自左神<程序员代码面试指南>"将搜索二叉树转换成双向链表"题目. 题目 对二叉树的节点来说,有本身的值域,有指向左孩子节点和右孩子节点的两个指针:对双向链表的节点 ...

  5. 判断一个数列是不是搜索二叉树后续遍历输出的结果

    剑平面阿里被问到这个,刚开始画了下看有什么性质,乱蒙了几个都被推翻了,初始感觉就是要O(n)的,因为印象中BST的构树都可以O(nlogn)搞定.然后剑平说最后一个数肯定是根节点,一下反应过来了,就是 ...

  6. 牛客题霸 [ 判断一棵二叉树是否为搜索二叉树和完全二叉树] C++题解/答案

    牛客题霸 [ 判断一棵二叉树是否为搜索二叉树和完全二叉树] C++题解/答案 题解: 搜索二叉树满足以下性质: 1.非空左子树的所以键值小于其根节点的键值 2.非空右子树的所有键值大于其根节点的键值 ...

  7. 将搜索二叉树转换为链表_将给定的二叉树转换为双链表(DLL)

    将搜索二叉树转换为链表 Given a Binary tree and we have to convert it to a Doubly Linked List (DLL). 给定二叉树,我们必须将 ...

  8. java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能

    二叉排序树的定义: 二叉排序树满足以下三个性质(BST性质): <1>若它的左子树非空,则左子树上所有节点的值均小于根节点的值 <2>若它的右子树非空,则右子树上所有节点的值均 ...

  9. 【To Do 难点】最大搜索二叉树

    最大搜索二叉树 本博客转载自:https://blog.csdn.net/jingsuwen1/article/details/51920731 题目描述:给定一颗二叉树,已知其中所有节点的值都不一样 ...

最新文章

  1. Python的零基础超详细讲解(第三天)-Python的基础语法
  2. ViewConfiguration.getScaledTouchSlop () 用法
  3. java从键盘输入一组数据,输出其最大值,平均值,最小值没法输出
  4. 科技前沿智能创新 2019北京智能家居 全屋智能博览会
  5. Java中Comparable和Comparator接口的区别
  6. SQL Server列名显示无效
  7. java.io.IOException: Server returned HTTP response code: 411 for URL
  8. Struts2,在Action中使用session
  9. 基于深度学习的数字识别GUI的设计
  10. linux 内核修炼之道——系统调用
  11. word_大纲视图/导航视图/设置标题时需要注意(不成功的原因)
  12. Android模仿新浪微博(前言)
  13. 苹果白屏一直显示苹果_苹果手机出现白屏要如何修复
  14. 深度学习速成版01---神经网络
  15. 梦之解读:如何成为牛人
  16. 蓝牙map协议源码解析
  17. 【kimol君的无聊小发明】—用python写论文下载器(图形化界面)
  18. win8输入法图标不见了
  19. P1085 [NOIP2004 普及组第一题] 不高兴的津津 ← 模拟题
  20. Win10+Ubuntu双系统安装教程

热门文章

  1. React Native之hardwareBackPress
  2. LeetCode之Palindrome Number(回文数)
  3. linux c之STDIN_FILENO的作用及与stdin的区别
  4. linux c之管道的介绍、创建关闭和简单读写(父进程向子进程写入数据)
  5. Linux下最简单的修改文件名后缀的命令行技巧
  6. Android之SharedPreferences 存储复杂对象
  7. Linux之VI命令详解
  8. 《零基础看得懂的C语言入门教程 》——(十二)原来结构体是这么回事
  9. 安卓模拟器获取服务器信息出错,安卓模拟器客户端与服务器不同步
  10. 围棋经典棋谱_秀秀老师:茶艺师也要学好围棋