二叉搜索树的应用

    xiaoxiao2021-12-03  52

    如果给我一个二叉搜索树的数据,一定要从头开始找,另外我还学到了双指针或多个指针记录前面顺序等想法。毕竟没学过ACM,啥都不会,哈哈哈哈

    #include <iostream> #include<queue> using namespace std; template<class T> class BinarySearchTreeNode { public: T data; BinarySearchTreeNode<T> * leftchild; BinarySearchTreeNode<T>* rightchild; BinarySearchTreeNode(T ele,BinarySearchTreeNode<T>* l=NULL,BinarySearchTreeNode<T>* r=NULL) { data=ele; leftchild=l; rightchild=r; } }; template<class T> class BinarySearchTree { public: BinarySearchTreeNode<T>* root; BinarySearchTreeNode<T>* search(T val); bool insert(T val); bool deletebyCopying(T val); void LevelOrder(BinarySearchTreeNode<T> *root); BinarySearchTree() { root=NULL; } }; template<class T> BinarySearchTreeNode<T>* BinarySearchTree<T>::search(T val) { if(root==NULL) { return NULL; } BinarySearchTreeNode<T> *p=root; while(p) { if(p->data<val) { p=p->rightchild; } else if(p->data>val) { p=p->leftchild; } else { break; } } if(!p) { return NULL; } else { return p; } } template<class T> bool BinarySearchTree<T>::insert(T val) { BinarySearchTreeNode<T> *pre=root; BinarySearchTreeNode<T> *p=root; if(root==NULL) { root=new BinarySearchTreeNode<T>(val,NULL,NULL); return true; } else { while(p) { if(p->data<val) { pre=p; p=p->rightchild; } else { pre=p; p=p->leftchild; } } if(pre->data<val) { pre->rightchild=new BinarySearchTreeNode<T>(val,NULL,NULL); } else { pre->leftchild=new BinarySearchTreeNode<T>(val,NULL,NULL); } } } template<class T> void visit(BinarySearchTreeNode<T>* p) { cout<<p->data<<endl; } template<class T> void BinarySearchTree<T>::LevelOrder(BinarySearchTreeNode<T> *root) { using std::queue; queue<BinarySearchTreeNode<T> *>nodeQueue; BinarySearchTreeNode<T> *pointer=root; if(pointer) { nodeQueue.push(pointer); } while(!nodeQueue.empty()) { pointer=nodeQueue.front(); visit(pointer); nodeQueue.pop(); if(pointer->leftchild) nodeQueue.push(pointer->leftchild); if(pointer->rightchild) nodeQueue.push(pointer->rightchild); } } template<class T> bool BinarySearchTree<T>::deletebyCopying(T val) { BinarySearchTreeNode<T> *q; BinarySearchTreeNode<T> *p=root; BinarySearchTreeNode<T> *preq; BinarySearchTreeNode<T> *pre; if(root==NULL) { return false; } while(p) { if(p->data==val) { break; } else if(p->data>val) { pre=p; p=p->leftchild; } else if(p->data<val) { pre=p; p=p->rightchild; } } if(p==NULL) { return false; } else { if(p->leftchild==NULL||p->rightchild==NULL) { q=p->leftchild?p->leftchild:p->rightchild; if(pre->leftchild==p) { pre->leftchild=q; } else if(pre->rightchild==p) { pre->rightchild=q; } delete p; } else { q=p->leftchild; preq=q; while(q->rightchild) { preq=q; q=q->rightchild; } p->data=q->data; preq->rightchild=NULL;//删除被替换的节点; } return true; } } int main() { BinarySearchTree<int> t; t.insert(5); t.insert(2); t.insert(3); t.insert(1); t.insert(7); t.insert(6); t.LevelOrder(t.root); t.deletebyCopying(3); t.LevelOrder(t.root); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-680199.html

    最新回复(0)