标准BST二叉搜索树写法

  本人最近被各种数据结构的实验折磨的不要不要的,特别是代码部分,对数据结构有严格的要求,比如写个BST要分成两个类,一个节点类,要给树类,关键是所以操作都要用函数完成,也就是在树类中不能直接操作节点,需要使用节点类中的函数来实现各种操作。

  简直太麻烦,但是花时间写了也是有好处的,认真写完绝对几年忘不了。同时用函数操作数据也更安全,将数据设为私有成员更符合规范。下面给出代码。

  

 1 #include<iostream>
 2 using namespace std;
 3
 4 class BinNode {
 5 private:
 6     int element;
 7     BinNode *leftChild;
 8     BinNode *rightChild;
 9 public:
10         BinNode(int a, BinNode* left, BinNode* right) {
11         element = a;
12         leftChild = left;
13         rightChild = right;
14     }
15     int val() { return element; }
16     BinNode* left() { return leftChild; }
17     void setLeft(BinNode *t) {  leftChild=t; }
18     BinNode* right() { return rightChild; }
19     void setRight(BinNode *t) { rightChild = t; }
20 };
21 class BST{
22 private:
23     BinNode *root;
24      BinNode* insertHelp(int x, BinNode* root) {
25          BinNode* t = root;
26          if (t == NULL) { t = new BinNode(x, NULL, NULL); return t; }
27         else if (x < t->val())
28             t->setLeft(insertHelp(x, t->left()));
29         else if (x > t->val())
30             t->setRight(insertHelp(x, t->right()));
31         return t;
32     }
33     void findHelp(const int x, int &count, BinNode* root) {
34         count++;
35         if (root == NULL) { count = 0;return; }
36         else if (root->val() == x)  return;
37         if(x<root->val())
38             findHelp(x, count, root->left());
39         if(x>=root->val())
40         findHelp(x, count, root->right());
41     }
42 public:
43     BST() {    root = NULL;}
44     ~BST() { clear(root);}
45
46     void clear(BinNode *root) {
47         if (root != NULL) {
48             clear(root->left());
49             clear(root->right());
50             delete root;
51         }
52     }
53     void insert(int& x) {
54         root=insertHelp(x, root);
55     }
56     void find(const int x, int &count) {
57         findHelp(x, count, root);
58     }
59 };
60 int main() {
61     BST a;
62     int n;
63     cout << "请输入节点个数:" << endl;
64     cin >> n;
65     cout << "依次输入节点值:"<<endl;
66     for (int i = 0;i < n;i++) {
67         int x;cin >> x;
68         a.insert(x);
69     }
70     int num;
71     while ((cout << "请输入需要查找的值:(ctrl+z结束查找)" << endl)&&(cin>>num)&&num!=EOF){
72         int count=0;
73         a.find(num, count);
74         if (count == 0)
75             cout << "查找失败!" << endl;
76         else
77             cout << "查找成功!查找次数为:" << count << endl;
78     }
79     system("pause");
80     return 0;
81 }

下面是实验报告的文档地址

http://wenku.baidu.com/view/d97fb2b114791711cd791711

时间: 2024-10-09 08:01:42

标准BST二叉搜索树写法的相关文章

BST二叉搜索树

1.二叉搜索树 (1).逼近折半查找的查找算法: (2).一般不允许出现重复数字,不然没法存储: (3).满足:左孩子数据 < 根结点数据 < 右孩子数据:根(父)结点比左孩子的大,比右孩子的小: (4)左子树和右子树也是二叉搜索树: 2.为什么叫二叉搜索树? 如果对一颗二叉搜索树进行中序遍历,可以按从小到大的顺序输出,此时又叫做二叉排序树. 如图: 3.搜索二叉树上的操作 全部用C++实现的. (1).之前学习二叉树,并没有说什么插入,删除操作,那是因为,没有规律而言,怎么进行操作呢?搜索二

[LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another comput

数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: BST树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中: 如果BST树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树 的搜索性能逼近二分查找:但它比连续内存空间的二分查找的优点是,改变BST树结构 插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销: 如:

[LeetCode] 938. Range Sum of BST 二叉搜索树的区间和

Given the?`root`?node of a binary search tree, return the sum of values of all nodes with value between?`L`?and?`R`?(inclusive). The binary search tree is guaranteed to have unique values. Example 1: Input: root = [10,5,15,3,7,null,18], L = 7, R = 15

【转载】Morris遍历二叉树 &amp; BST(二叉搜索树) Traverse &amp; 空间O(1) 时间O(n)

因为做一道Leetcode的题目(前面博客有:link),需要用Space O(1)空间复杂度来中序遍历树, 看了Discuss,也上网搜了一下,发现空间O(1)可以用 Morris遍历的方法.方法介绍如下: http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html其中,中序遍历和前序遍历比较方便解决: 通常,实现二叉树的前序(preorder).中序(inorder).后序(postorder)遍历有两个常用

POJ 2309 BST(二叉搜索树)

BST Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8657   Accepted: 5277 Description Consider an infinite full binary search tree (see the figure below), the numbers in the nodes are 1, 2, 3, .... In a subtree whose root node is X, we c

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找--方法一:顺序查找(时间复杂度O(n)) int SequentialSearch(St

二叉搜索树BST

二叉搜索树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树: 1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 3. 任意节点的左.右子树也分别为二叉查找树. 4. 没有键值相等的节点. 通过中序遍历可以得到一个有序数列.一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程.每次插入的新的结点都是二叉排序树上新的叶子结点,在进行插入操