⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bintree.h

📁 小波分析程序
💻 H
字号:
//****************************************************************************// BinTree.h                                     Header file for BinTree class//***************************************************************************#ifndef BINTREE_H#define BINTREE_H#include "common.h"#include <assert.h>template <class CONTENTYPE> class Node                      // node of BinTree{public:  Node(const CONTENTYPE &c, Node<CONTENTYPE> *l, Node<CONTENTYPE> *r) :    content(c), left(l), right(r) { }                                // constructor. sets content, left and right  CONTENTYPE content;           // what is stored in the node  Node<CONTENTYPE> *left;       // pointer to left child  Node<CONTENTYPE> *right;      // pointer to right child};///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>class BinTree{ public:  BinTree():  root(0) { }                 // default constructor, empty tree  BinTree(const BinTree<CONTENTYPE> &);   // copy constructor  virtual ~BinTree();                     // destructor  virtual BinTree<CONTENTYPE>& operator=(const BinTree<CONTENTYPE>& Rhs);           // overloaded assignment  void CopyTree(const Node<CONTENTYPE>* From, Node<CONTENTYPE>* &To);          // copies tree rooted at From into a tree rooted at To  void DestroyTree();                            // deallocates all memeory  void DestroyTreeHelp(Node<CONTENTYPE>* &ptr);  // utility   Node<CONTENTYPE> *root;};// end of BinTree class definition//////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>class BinTreeComplete : public BinTree<CONTENTYPE>{ public:  BinTreeComplete() : maxlevel(0) { BinTree<CONTENTYPE>::BinTree(); }  BinTreeComplete(integer MAXLEVEL, const CONTENTYPE &c);               // set maxlevel=MAXLEVEL and construct tree with contents of all       // nodes equal c.   BinTreeComplete(const BinTreeComplete<CONTENTYPE> &);     // copy constructor  BinTreeComplete<CONTENTYPE>& operator=(const BinTreeComplete<CONTENTYPE> &);                                          Node<CONTENTYPE> *block(const integer &L, const integer &B);       // return pointer to B-th node at level L Node<CONTENTYPE> *blockHelp(Node<CONTENTYPE> *pos,			     const integer &L, const integer &B) const;    void SetConst(Node<CONTENTYPE> **ptr, const integer &L, const CONTENTYPE &c);       // attach to *ptr a tree with levels 0...L, filled up with constant c integer maxlevel;     // levels numbered from 0 to maxlevel                               };// end of BinTreeComplete class definitiontypedef BinTreeComplete<real> Tree;////////////////////////////////////////////////////////////////////////////////*********************** Implementation **************************************/template <class CONTENTYPE>BinTree<CONTENTYPE>::BinTree(const BinTree<CONTENTYPE> &Rhs){  CopyTree(Rhs.root, root);}///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE> BinTree<CONTENTYPE>::~BinTree(){     DestroyTree();}///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>BinTree<CONTENTYPE> &BinTree<CONTENTYPE>::operator=(const BinTree<CONTENTYPE>& Rhs)  {  if(this != &Rhs)    {      DestroyTreeHelp(root);      CopyTree(Rhs.root, root);    }  return *this;}///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>void BinTree<CONTENTYPE>::CopyTree(const Node<CONTENTYPE>* From,				   Node<CONTENTYPE>* &To){  // use preorder  if( From != 0 )    {  // copy node      To = new Node<CONTENTYPE>(From->content, 0, 0);      assert( To != 0);         CopyTree(From->left, To->left);      CopyTree(From->right, To->right);    }  else  To = 0;   // copy empty tree} ///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>void BinTree<CONTENTYPE>::DestroyTree(){  DestroyTreeHelp( root );}///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>void BinTree<CONTENTYPE>::DestroyTreeHelp(Node<CONTENTYPE>* &ptr){  // use postorder  if( ptr != 0 )    {       DestroyTreeHelp(ptr->left);      DestroyTreeHelp(ptr->right);        delete ptr;      ptr=0;    }}///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>BinTreeComplete<CONTENTYPE>::BinTreeComplete(integer MAXLEVEL, 					     const CONTENTYPE &c) :  maxlevel(MAXLEVEL){  assert(maxlevel>0);  SetConst(&root, maxlevel, c);}///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>BinTreeComplete<CONTENTYPE>::BinTreeComplete(				  const BinTreeComplete<CONTENTYPE> &Rhs){  BinTree<CONTENTYPE>::CopyTree(Rhs.root, root);}///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>BinTreeComplete<CONTENTYPE>& BinTreeComplete<CONTENTYPE>::operator=                                       (const BinTreeComplete<CONTENTYPE> &Rhs){    maxlevel = Rhs.maxlevel;    BinTree<CONTENTYPE>::operator=(Rhs);}///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>Node<CONTENTYPE> *BinTreeComplete<CONTENTYPE>::block(const integer &L,						    const integer &B){  assert( 0<=L && L<=maxlevel && 0<=B && B<=(1<<L) );  return blockHelp(root, L, B);}///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>Node<CONTENTYPE> *BinTreeComplete<CONTENTYPE>::blockHelp(Node<CONTENTYPE> *pos,				     const  integer &L, const integer &B) const{  Node<CONTENTYPE> *ptr;  if( L && pos)    {      if(B&(1<<(L-1)))                  // if L-bit of B is odd => turn right	ptr=blockHelp(pos->right, L-1, B^(1<<(L-1)) );      else	ptr=blockHelp(pos->left, L-1, B);    }  else ptr=pos;  return ptr;}///////////////////////////////////////////////////////////////////////////////template <class CONTENTYPE>void BinTreeComplete<CONTENTYPE>::SetConst(Node<CONTENTYPE> **ptr, 				   const integer &L, const CONTENTYPE &c){  if( L > 0 )    {      if( *ptr==0 )	{       	  (*ptr) = new Node<CONTENTYPE>(c, 0, 0);	  assert( *ptr != 0 );	}      else (*ptr)->content=c;        SetConst(&((*ptr)->left), L-1, c);      SetConst(&((*ptr)->right), L-1, c);    }}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -