数据结构课上自己写了个二叉树类,后面一堆数据结构课的作业全是在这个代码上改的,有需求的自取。
普通二叉树
#include <iostream>
using namespace std;
template <class ElemType>
struct BinTreeNode
{
ElemType data;
BinTreeNode<ElemType> *leftChild;
BinTreeNode<ElemType> *rightChild;
BinTreeNode();
BinTreeNode(const ElemType &d,BinTreeNode<ElemType> *lChild=NULL,BinTreeNode<ElemType> *rChild=NULL);
BinTreeNode(const BinTreeNode<ElemType>& cpy);
};
template<class ElemType>
BinTreeNode<ElemType>::BinTreeNode() //无参构造
{
leftChild=rightChild=NULL;
}
template<class ElemType>
BinTreeNode<ElemType>::BinTreeNode(const ElemType &d,BinTreeNode<ElemType> *lChild,BinTreeNode<ElemType> *rChild) //含参构造
{
data=d;
leftChild=lChild;
rightChild=rChild;
}
template <class ElemType>
class BinaryTree
{
protected:
BinTreeNode<ElemType> *root;
BinTreeNode<ElemType> *CopyTree(BinTreeNode<ElemType> *t);
void Destroy(BinTreeNode<ElemType> *&r);
BinTreeNode<ElemType>* buildWithPreIn(ElemType *pre,ElemType *in,int size);
public:
~BinaryTree();
BinaryTree(ElemType *pre,ElemType *in,int size);
void PreOrder(BinTreeNode<ElemType>* r); //正序输出以r为根的树,不换行
void InOrder(BinTreeNode<ElemType>* r); //中序输出以r为根的树,不换行
void PostOrder(BinTreeNode<ElemType>* r); //后序输出以r为根的树,不换行
void showPre();
void showIn();
void showPost();
};
template<class ElemType>
BinTreeNode<ElemType>* BinaryTree<ElemType>::CopyTree(BinTreeNode<ElemType> *t)
{
BinTreeNode<ElemType>* tcpy=new BinTreeNode<ElemType>(t->data);
if(t->leftChild!=NULL)
{
BinTreeNode<ElemType>* left=CopyTree(t->leftChild);
tcpy->leftChild=left;
}
if(t->rightChild!=NULL)
{
BinTreeNode<ElemType>* right=CopyTree(t->rightChild);
tcpy->rightChild=right;
}
root=tcpy;
return tcpy;
}
template<class ElemType>
void BinaryTree<ElemType>::Destroy(BinTreeNode<ElemType> *&r)
{
if(r!=NULL)
{
Destroy(r->leftChild);
Destroy(r->rightChild);
delete r;
r=NULL;
}
}
template<class ElemType>
BinTreeNode<ElemType>* BinaryTree<ElemType>::buildWithPreIn(ElemType *pre,ElemType *in,int size)
{
if(size==0)
{
return NULL;
}
int pos=0;
BinTreeNode<ElemType>* r=new BinTreeNode<ElemType>(pre[0]);
for(int i=0;i<size;i++)
{
if(in[i]==pre[0])
{
pos=i;
break;
}
}
r->leftChild=buildWithPreIn(pre+1, in, pos);
r->rightChild=buildWithPreIn(pre+1+pos, in+1+pos, size-pos-1);
return r;
}
template<class ElemType>
BinaryTree<ElemType>::~BinaryTree()
{
Destroy(root);
}
template<class ElemType>
BinaryTree<ElemType>::BinaryTree(ElemType *pre,ElemType *in,int size)
{
root=buildWithPreIn(pre, in, size);
}
template<class ElemType>
void BinaryTree<ElemType>::PreOrder(BinTreeNode<ElemType>* r)
{
if(r==NULL)
{
return;
}
cout<<r->data<<" ";
PreOrder(r->leftChild);
PreOrder(r->rightChild);
return;
}
template<class ElemType>
void BinaryTree<ElemType>::InOrder(BinTreeNode<ElemType>* r)
{
if(r==NULL)
{
return;
}
InOrder(r->leftChild);
cout<<r->data<<" ";
InOrder(r->rightChild);
return;
}
template<class ElemType>
void BinaryTree<ElemType>::PostOrder(BinTreeNode<ElemType>* r)
{
if(r==NULL)
{
return;
}
PostOrder(r->leftChild);
PostOrder(r->rightChild);
cout<<r->data<<" ";
return;
}
template<class ElemType>
void BinaryTree<ElemType>::showPre()
{
PreOrder(root);
cout<<endl;
}
template<class ElemType>
void BinaryTree<ElemType>::showIn()
{
InOrder(root);
cout<<endl;
}
template<class ElemType>
void BinaryTree<ElemType>::showPost()
{
PostOrder(root);
cout<<endl;
}
int main()
{
char pre[]={'A','B','D','E','H','C','F','G'};
char in[]={'D','B','E','H','A','F','C','G'};
BinaryTree<char> tree(pre,in,8);
tree.showPre();
}
一般树孩子兄弟表示法
#include<iostream>
#include<queue>
using namespace std;
template <class ElemType>
struct TreeNode
{
ElemType data;
TreeNode<ElemType> *firstChild;
TreeNode<ElemType> *nextSibling;
TreeNode();
TreeNode(const ElemType &d,TreeNode<ElemType> *child=NULL,TreeNode<ElemType> *sibling=NULL);
TreeNode(const TreeNode<ElemType>& cpy);
};
template<class ElemType>
TreeNode<ElemType>::TreeNode() //无参构造
{
firstChild=nextSibling=NULL;
}
template<class ElemType>
TreeNode<ElemType>::TreeNode(const ElemType &d,TreeNode<ElemType> *child,TreeNode<ElemType> *sibling) //含参构造
{
data=d;
firstChild=child;
nextSibling=sibling;
}
template <class ElemType>
class Tree
{
protected:
TreeNode<ElemType> *root;
void Destroy(TreeNode<ElemType> *&r);
TreeNode<ElemType>* buildWithPreIn(ElemType *pre,ElemType *in,int size);
public:
~Tree();
Tree(ElemType *pre,ElemType *in,int size);
void PreOrder(TreeNode<ElemType>* r); //正序输出以r为根的树,不换行
void InOrder(TreeNode<ElemType>* r); //中序输出以r为根的树,不换行
void PostOrder(TreeNode<ElemType>* r); //后序输出以r为根的树,不换行
void showPre();
void showIn();
void showPost();
int getDepth(const ElemType & find,int ans=1,TreeNode<ElemType> *r=NULL) const ;
int Depth() const;
int Degree() const;
};
template<class ElemType>
void Tree<ElemType>::Destroy(TreeNode<ElemType> *&r)
{
if(r!=NULL)
{
Destroy(r->firstChild);
Destroy(r->nextSibling);
delete r;
r=NULL;
}
}
template<class ElemType>
TreeNode<ElemType>* Tree<ElemType>::buildWithPreIn(ElemType *pre,ElemType *in,int size)
{
if(size==0)
{
return NULL;
}
int pos=0;
TreeNode<ElemType>* r=new TreeNode<ElemType>(pre[0]);
for(int i=0;i<size;i++)
{
if(in[i]==pre[0])
{
pos=i;
break;
}
}
r->firstChild=buildWithPreIn(pre+1, in, pos);
r->nextSibling=buildWithPreIn(pre+1+pos, in+1+pos, size-pos-1);
return r;
}
template<class ElemType>
Tree<ElemType>::~Tree()
{
Destroy(root);
}
template<class ElemType>
Tree<ElemType>::Tree(ElemType *pre,ElemType *in,int size)
{
root=buildWithPreIn(pre, in, size);
}
template<class ElemType>
void Tree<ElemType>::PreOrder(TreeNode<ElemType>* r)
{
if(r==NULL)
{
return;
}
cout<<r->data<<" ";
PreOrder(r->firstChild);
PreOrder(r->nextSibling);
return;
}
template<class ElemType>
void Tree<ElemType>::InOrder(TreeNode<ElemType>* r)
{
if(r==NULL)
{
return;
}
InOrder(r->firstChild);
cout<<r->data<<" ";
InOrder(r->nextSibling);
return;
}
template<class ElemType>
void Tree<ElemType>::PostOrder(TreeNode<ElemType>* r)
{
if(r==NULL)
{
return;
}
PostOrder(r->firstChild);
PostOrder(r->nextSibling);
cout<<r->data<<" ";
return;
}
template<class ElemType>
void Tree<ElemType>::showPre()
{
PreOrder(root);
cout<<endl;
}
template<class ElemType>
void Tree<ElemType>::showIn()
{
InOrder(root);
cout<<endl;
}
template<class ElemType>
void Tree<ElemType>::showPost()
{
PostOrder(root);
cout<<endl;
}
template<class ElemType>
int Tree<ElemType>::getDepth(const ElemType & find,int ans,TreeNode<ElemType> *r) const
{
if(r==NULL)
{
r=this->root;
}
if(r==NULL)
return -1;
if(r->data==find)
return ans;
TreeNode<ElemType> *p=r;
if(p->firstChild!=NULL)
{
int dep=getDepth(find,ans+1,p->firstChild);
if(dep!=-1)
{
return dep;
}
}
TreeNode<ElemType> *s=p;
while(s->data!=find)
{
if(s->firstChild!=NULL)
{
int dep=getDepth(find,ans+1,s->firstChild);
if(dep!=-1)
return dep;
}
if(s->nextSibling==NULL)
{
break;
}
else s=s->nextSibling;
}
if(s->data==find)
return ans;
return -1;
}
template<class ElemType>
int Tree<ElemType>::Depth() const
{
int ans=1;
TreeNode<ElemType> *p=root;
while(p->firstChild!=NULL)
{
ans++;
p=p->firstChild;
}
return ans;
}
template<class ElemType>
int Tree<ElemType>::Degree() const
{
if(root==NULL||root->firstChild==NULL)
return 0;
queue<TreeNode<ElemType>*> q;
int ans=0;
q.push(root->firstChild);
while(!q.empty())
{
TreeNode<ElemType> *p=q.front();
int temp=0;
while(p!=NULL)
{
if(p->firstChild!=NULL)
q.push(p->firstChild);
temp++;
p=p->nextSibling;
}
ans=max(ans,temp);
q.pop();
}
return ans;
}
int main()
{
char pre[]={'I','A','B','D','E','H','C','F','G'};
char in[]={'D','B','E','H','A','F','C','G','I'};
Tree<char> tree(pre,in,9);
cout<<tree.getDepth('F')<<endl;
cout<<tree.Depth()<<endl;
cout<<tree.Degree()<<endl;
}
BST二叉排序树
#include <iostream>
#include<algorithm>
using namespace std;
const int inf=999999999;
template <class ElemType>
struct BinTreeNode
{
ElemType data;
BinTreeNode<ElemType> *leftChild;
BinTreeNode<ElemType> *rightChild;
BinTreeNode();
BinTreeNode(const ElemType &d,BinTreeNode<ElemType> *lChild=NULL,BinTreeNode<ElemType> *rChild=NULL);
BinTreeNode(const BinTreeNode<ElemType>& cpy);
};
template<class ElemType>
BinTreeNode<ElemType>::BinTreeNode() //无参构造
{
leftChild=rightChild=NULL;
}
template<class ElemType>
BinTreeNode<ElemType>::BinTreeNode(const ElemType &d,BinTreeNode<ElemType> *lChild,BinTreeNode<ElemType> *rChild) //含参构造
{
data=d;
leftChild=lChild;
rightChild=rChild;
}
template <class ElemType>
class BinaryTree
{
protected:
BinTreeNode<ElemType> *root;
BinTreeNode<ElemType> *CopyTree(BinTreeNode<ElemType> *t);
void Destroy(BinTreeNode<ElemType> *&r);
BinTreeNode<ElemType>* buildWithPreIn(ElemType *pre,ElemType *in,int size);
public:
~BinaryTree();
BinaryTree(ElemType *pre,ElemType *in,int size);
void PreOrder(BinTreeNode<ElemType>* r); //正序输出以r为根的树,不换行
void InOrder(BinTreeNode<ElemType>* r); //中序输出以r为根的树,不换行
void PostOrder(BinTreeNode<ElemType>* r); //后序输出以r为根的树,不换行
void showPre();
void showIn();
void showPost();
bool isBST(const BinTreeNode<ElemType> *r,int minx,int maxx) const;
void outputIsBST() const;
//判断是否是BST
void findLittle(const BinTreeNode<ElemType> *r,const ElemType & x) const;
void outputLittle(const ElemType & x) ;
//输出比x小的所有元素
};
template<class ElemType>
BinTreeNode<ElemType>* BinaryTree<ElemType>::CopyTree(BinTreeNode<ElemType> *t)
{
BinTreeNode<ElemType>* tcpy=new BinTreeNode<ElemType>(t->data);
if(t->leftChild!=NULL)
{
BinTreeNode<ElemType>* left=CopyTree(t->leftChild);
tcpy->leftChild=left;
}
if(t->rightChild!=NULL)
{
BinTreeNode<ElemType>* right=CopyTree(t->rightChild);
tcpy->rightChild=right;
}
root=tcpy;
return tcpy;
}
template<class ElemType>
void BinaryTree<ElemType>::Destroy(BinTreeNode<ElemType> *&r)
{
if(r!=NULL)
{
Destroy(r->leftChild);
Destroy(r->rightChild);
delete r;
r=NULL;
}
}
template<class ElemType>
BinTreeNode<ElemType>* BinaryTree<ElemType>::buildWithPreIn(ElemType *pre,ElemType *in,int size)
{
if(size==0)
{
return NULL;
}
int pos=0;
BinTreeNode<ElemType>* r=new BinTreeNode<ElemType>(pre[0]);
for(int i=0;i<size;i++)
{
if(in[i]==pre[0])
{
pos=i;
break;
}
}
r->leftChild=buildWithPreIn(pre+1, in, pos);
r->rightChild=buildWithPreIn(pre+1+pos, in+1+pos, size-pos-1);
return r;
}
template<class ElemType>
BinaryTree<ElemType>::~BinaryTree()
{
Destroy(root);
}
template<class ElemType>
BinaryTree<ElemType>::BinaryTree(ElemType *pre,ElemType *in,int size)
{
root=buildWithPreIn(pre, in, size);
}
template<class ElemType>
void BinaryTree<ElemType>::PreOrder(BinTreeNode<ElemType>* r)
{
if(r==NULL)
{
return;
}
cout<<r->data<<" ";
PreOrder(r->leftChild);
PreOrder(r->rightChild);
return;
}
template<class ElemType>
void BinaryTree<ElemType>::InOrder(BinTreeNode<ElemType>* r)
{
if(r==NULL)
{
return;
}
InOrder(r->leftChild);
cout<<r->data<<" ";
InOrder(r->rightChild);
return;
}
template<class ElemType>
void BinaryTree<ElemType>::PostOrder(BinTreeNode<ElemType>* r)
{
if(r==NULL)
{
return;
}
PostOrder(r->leftChild);
PostOrder(r->rightChild);
cout<<r->data<<" ";
return;
}
template<class ElemType>
void BinaryTree<ElemType>::showPre()
{
PreOrder(root);
cout<<endl;
}
template<class ElemType>
void BinaryTree<ElemType>::showIn()
{
InOrder(root);
cout<<endl;
}
template<class ElemType>
void BinaryTree<ElemType>::showPost()
{
PostOrder(root);
cout<<endl;
}
template<class ElemType>
bool BinaryTree<ElemType>::isBST(const BinTreeNode<ElemType> *r,int minx,int maxx) const
{
if(r==NULL)
return 1;
if(r->data < minx ||r->data >maxx)
return 0;
return isBST(r->leftChild, minx, r->data-1) && isBST(r->rightChild, r->data-1, maxx);
}
template<class ElemType>
void BinaryTree<ElemType>::outputIsBST() const
{
cout<<isBST(root, -inf, inf)<<endl;
}
template<class ElemType>
void BinaryTree<ElemType>::findLittle(const BinTreeNode<ElemType> *r,const ElemType & x) const
{
if(r==NULL)
return;
if(r->data>x)
{
findLittle(r->leftChild, x);
}
if(r->data==x)
{
cout<<r->data<<" ";
findLittle(r->leftChild, x);
}
if(r->data<x)
{
findLittle(r->rightChild, x);
cout<<r->data<<" ";
findLittle(r->leftChild, x);
}
}
template<class ElemType>
void BinaryTree<ElemType>::outputLittle(const ElemType & x)
{
findLittle(root, x);
}
int main()
{
int pre[]={5,2,1,4,3,6,9,8};
int in[]={1,2,3,4,5,6,8,9};
BinaryTree<int> tree(pre,in,8);
tree.outputIsBST();
tree.outputLittle(6);
}