日常说明:有错误欢迎大家指正。另外本博客所有的代码博主编写后均调试通过。重要提醒!!!!博主使用的是VS2017,如果有低版本的小伙伴最好新建空项目将此代码复制上去。
更多算法请关注我的算法专栏https://blog.csdn.net/column/details/20417.html
运行截图:
本算法采用比较简单,也比较局限的方法。先用先序遍历建树,然后再进行查找。相对于可输入乱序数字,进行比较插入的方法而言,闲的笨拙。插入法建树也比较容易实现:
template<class T> //模板类
BTree<T>::InsertBST(BNode<T>*q,T e )
{
if (!SearchBST(T e,q,p))//没有查找成功
{
BNode<T>*s = (BTree)malloc(sizeof(BNode));//新结点申请空间
s->data = e;
s->lchild = s=>rchild = NULL;//初始化
if(!p) q = s;
else if(e>p->data) p->rchild = s;
else if(e<p->data) p->lchild = s;
}
}
但是这种插入建树法,也有弊端,就是如果你第一次插入的数据太小,那么会建成一个十分不平衡的树。极端情况下,会出现一条线型的树,时间复杂度和顺序查找一样,那么二叉排序树将变得毫无意义。接下里是我用先序遍历建树的过程,局限性在于,需要将数据排成先序遍历的顺序,也相当的局限,但主要是练习查找的过程,容易测试。
BSTree.h
#pragma once
#include <cstdlib>
#include <iostream>
#define Max 21
using namespace std;
template<class T>
class BTNode
{
public:
T data;
BTNode<T> *lchild, *rchild;
BTNode(T data,BTNode<T> *lchild = NULL,BTNode<T>*rchild = NULL)
{
this->data = data;
this->lchild = lchild;
this->rchild = rchild;
}
/*friend BSTree;*/
};
template<class T>
class BSTree
{
public:
BTNode<T> *root;//指向根结点
BSTree();
BSTree(T Inlist[Max]);//中序建二叉排序树
BTNode<T>*CreatTree(T Inlist[Max], int&i);
void SercherBST(BTNode<T>*q, T key, BSTree<T>tree,int list[]);
/*bool empty();*/
};
BSTree.cpp
#include "BSTree.h"
template<class T>
BSTree<T>::BSTree()
{
this->root = NULL;
}
template<class T>
BSTree<T>::BSTree(T Inlist[Max])
{
int i = 0;
this->root = this->CreatTree(Inlist,i);
}
template<class T>
BTNode<T>*BSTree<T>::CreatTree(T Inlist[Max], int&i)
{
BTNode<T>*p = NULL;
if (i<Max)
{
T data = Inlist[i];
i++;
if (data != NULL)
{
p = new BTNode<T>(data);
p->lchild = CreatTree(Inlist, i);//创建新的结点
p->rchild = CreatTree(Inlist, i);//递归调用
}
}
return p;
}
//template<class T>
//bool BSTree<T>::empty()
//{
// return this->root == NULL;
//}
template<class T>
void BSTree<T>::SercherBST(BTNode<T>*q, T key, BSTree<T>tree,int list[])
{
if (!q)
{
q = this->root;
}
if (q->data!= NULL &&q->data == key)
{
cout<<"在排序二叉树中匹配的数字为:"<<q->data<<endl;
cout << endl;
}
if (q->data != NULL)
{
if (q->data < key)
{
tree.SercherBST(q->rchild, key, tree,list);
}
if (q->data > key)
{
tree.SercherBST(q->lchild, key, tree,list);
}
}
}
int main()
{
int list[10] = {3,12,24,37,45,53,61,78,90,100};
int Inlist[Max] = {45,12,3,NULL,NULL,37,24,NULL,NULL,NULL,53,NULL,100,61,NULL,90,78,NULL,NULL,NULL,NULL };
BSTree<int>bstree(Inlist);
BTNode<int>*q = NULL;
cout << "请输入查找的元素:";
int key;
cin >> key;
bstree.SercherBST(q, key, bstree,list);
/*cout << "查找到的元素为:" << q->data;*/
return 0;
}