数据结构与算法学习之二叉排序树及二叉排序树的相关操作

二叉排序树是数表动态查找中的一种重要应用。

二叉排序树具备以下特点:

1)若它的左子树不为空,则左子树上的各结点的值均小于它的根结点的值;2)若它的右子树不为空,则其右子树上的各结点的值均大于等于它的根节点的值;3)它的左子树和右子树分别又是一个二叉排序树。

二叉排序树中的一些操作应该掌握,如如何建立一个二叉排序树,它的插入和删除操作,以及查找某个元素值的操作。下面是本人在学习时联系写的一些代码:

#include <iostream> using namespace std; typedef int Elemtype; class Streenode { /*二叉排序树的节点类定义*/ public: Streenode():data(0),lchild(NULL),rchild(NULL){} Elemtype data; Streenode *lchild, *rchild; }; class Stree { /*二叉排序树的类定义*/ public: Stree(){root=NULL;} //构造函数 ~Stree(){Makempty(root);root =NULL;} //析构函数,重要!!! Streenode* Insert(Elemtype,Streenode*); //插入元素函数 Streenode* Delete(Elemtype,Streenode*); //删除元素函数 Streenode* Find(Streenode*,Elemtype); //查找函数 Streenode* Findmin(Streenode*); //查找最小元素函数 Streenode* Findmax(Streenode*); //查找最大元素函数 void Inorder(Streenode*); Streenode *root; //根结点的指针 void Makempty(Streenode*); //释放结点单元 }; void Stree::Makempty(Streenode* p) { if(p!=NULL) { Makempty(p->lchild); Makempty(p->rchild); delete p; } } Streenode* Stree::Insert(Elemtype x, Streenode* p) { if (p==NULL) { p=new Streenode; p->data=x; p->lchild=NULL; p->rchild=NULL; } else { if(x<p->data) p->lchild=Insert(x,p->lchild); else p->rchild=Insert(x,p->rchild); } return p; } Streenode* Stree::Delete(Elemtype x, Streenode* p) { Streenode *tmp; if (p=NULL) cout<<"Element can not be found!!!"<<endl; else if (p->data<x) p->lchild=Delete(x,p->lchild); else if (p->data>x) p->rchild=Delete(x,p->rchild); else if(p->lchild && p->rchild) { tmp = Findmin(p->rchild); p->data= tmp->data; p->rchild = Delete(p->data,p->rchild); } else { tmp = p; if(p->lchild==NULL) p=p->rchild; if(p->rchild==NULL) p=p->lchild; delete tmp; } return p; } Streenode* Stree::Find(Streenode *p,Elemtype x) { if (p==NULL) return NULL; else if(p->data > x) return Find(p->lchild,x); else if(p->data < x) return Find(p->rchild,x); else return p; } Streenode* Stree::Findmin(Streenode *p) { if (p==NULL) return NULL; else if(p->lchild != NULL) return Findmin(p->lchild); else if(p->lchild == NULL) return p; } Streenode* Stree::Findmax(Streenode *p) { if (p==NULL) return NULL; else if(p->rchild != NULL) return Findmax(p->rchild); else if(p->rchild == NULL) return p; } void Stree::Inorder(Streenode *p) { if (p!=NULL) { Inorder(p->lchild); cout<<p->data; Inorder(p->rchild); } } int main() { Stree stree; stree.root=stree.Insert(7,stree.root); stree.root=stree.Insert(4,stree.root); stree.root=stree.Insert(11,stree.root); stree.root=stree.Insert(3,stree.root); stree.root=stree.Insert(6,stree.root); stree.root=stree.Insert(8,stree.root); stree.root=stree.Insert(12,stree.root); stree.Inorder(stree.root); }

 

你可能感兴趣的:(数据结构与算法学习之二叉排序树及二叉排序树的相关操作)