数据结构归纳——排序二叉树

来源:互联网 发布:淘宝店托管骗局 编辑:程序博客网 时间:2024/04/29 05:19

排序二叉树是二叉树的一种,但他是有序的,他有些一般二叉树没有的操作,比如插入。此外删除操作比较复杂,建议画图理解!

一,创建:

template<class T>//二叉树节点定义struct BiNode{T  data;//数据BiNode *left;//指向左孩子BiNode *right;//指向右孩子};

 

BiSortTree(T a[],int n)//将数据放在长度为n 的数组中用于创建二叉树{this->root = 0;for (int i = 0 ; i < n; i++){BiNode<T>* s = new BiNode<T>;//用一个指针指向一个新申请的节点。s->data = a[i];s->left = 0;//子节点不指向任何内存空间,为后面的插入做准备s->right = 0;InsertBST(this->root,s);//将该节点插入到二叉树中、}}

二,删除:

void DeleteBST(T t){BiNode<T>* p = SearchBST(this->root,t);DeleteBST(p);}//删除节点void DeleteBST(BiNode<T>* root){BiNode<T> * P = new BiNode<T>;BiNode<T> * par = new BiNode<T>;if (!root->left && !root->right)//如果左右孩子都为空,则直接删除该节点{delete root;} else{if (!root->left)//如果左孩子为空{BiNode<T> * p = root;//用一个指针指向该节点root = root->right;//将右孩子提到父节点的位置delete p ;//删除该节点} else{if (!root->right){BiNode<T> * p = root;root = root->left;delete p ;} else//如果都不为空{P = root;root = root->right;while(root->left)//找到右孩子的最左边的节点{par = root;root = root->left;}P->data = root->data;//将最左边节点的数据直接覆盖要删除的节点的数据if (par==root)//处理特殊情况{par->right = root->right;} else{par->left = root->right;}delete root;}}}}



 

三,插入函数:

 

        //重要的一点  BiNode<T> * & root 表示对指针的//引用。涉及到引用问题,经典的例题就是数值交换 void swap1(int a,int b){ int temp = a;a = b ;b =temp;}//和 void swap2(int &a ,int &b){ int temp = a;a = b ;b =temp;}。当一个数组里面的两个数要进行交换时,//调用swap1函数其实是无法真正进行交换的,这个原因应该大家都知道,就不在累述。void InsertBST(BiNode<T> * & root,BiNode<T> *&s){if (root == 0)//如果节点为空,则把当前的节点放在上面。{root = s;}else if (s->data > root->data)//数据比父节点大,放右子树{InsertBST(root->right,s);//递归调用} else//否则放左子树{InsertBST(root->left,s);}}

2,插入函数非递归算法:

void InsertBSTt(BiNode<T>* root,BiNode<T>* s)//非递归,,用队列和查找{Queue<BiNode<T>*> q = new Queue<BiNode<T>*>;BiNode<T>*p = new BiNode<T>;q.Enq(root);while(!q.IsEmpty()){q.Outq(p);//出队if (!p->left||!p->right)//如果只有一个孩子或则没有孩子{if (p->data>s->data&&!p->left){p->left = s;} if(p->data<s->data&&!p->right){p->right = s;}}//有两个孩子。则无法插入需入队if (p->left){q.Enq(p->left);//入队}if (p->right){q.Enq(p->right);}}}void SearchBST(T t){BiNode<T> * p = SearchBST(this->root,t);cout<<p<<"  "<<p->data<<endl;}


四,查找:

1,递归:

BiNode<T> * SearchBST(BiNode<T> * root,T t)//递归{if (root == nullptr){return nullptr;} else{if (root->data ==t){return root;} else{if (root->data > t){return SearchBST(root->left,t);} else{return SearchBST(root->right,t);}}}}


2,非递归:

BiNode<T>* searchBSTt(T t)//非递归,,用队列,思路和一般二叉树的层序遍历相同{Queue<BiNode<T>* >q(30);// = new Queue<BiNode<T>*>(20);BiNode<T>* p = new BiNode<T>;q.Enq(root);while(!q.IsEmpty()){q.Outq(p);if (p->data==t){cout<<p<<"  "<<p->data<<endl;return p ;}if (p->left){q.Enq(p->left);}if (p->right){q.Enq(p->right);}}}