利用C++模板生成随机二叉树

来源:互联网 发布:淘宝客服工作流程视频 编辑:程序博客网 时间:2024/06/06 02:45
构造一个生成随机二叉树的类,二叉树的结点 数、结点所存放的数据类型等都可以是任意的:
TreeElement.h描述的是二叉树的结点信息,Tree.h描述二叉树本身,代码如下:
TreeElement.h:
#ifndef TREEELEMENT_H
#define TREEELEMENT_H

template 
<class Type>
class TreeElement
{
private:
    Type 
&elementData;
    TreeElement 
*leftElement;
    TreeElement 
*rightElement;
public:
    TreeElement(Type 
&elementData);
    TreeElement
* getLeft();
    TreeElement
* getRight();
    Type
& getElementData();
    
bool setLeft(TreeElement*);
    
bool setRight(TreeElement*);
    
bool setElementData(Type &elementData);
}
;

template 
<class Type>
TreeElement
<Type>::TreeElement(Type &elementData):elementData(elementData)
{
    
this->leftElement = NULL;
    
this->rightElement = NULL;
}


template 
<class Type>
TreeElement
<Type>* TreeElement<Type>::getLeft()
{
    
return leftElement;
}


template 
<class Type>
TreeElement
<Type>* TreeElement<Type>::getRight()
{
    
return rightElement;
}


template 
<class Type>
Type
& TreeElement<Type>::getElementData()
{
    
return elementData;
}


template 
<class Type>
bool TreeElement<Type>::setLeft(TreeElement<Type> *left)
{
    
if(left == NULL)
        
return false;
    
this->leftElement = left;
    
return true;
}


template 
<class Type>
bool TreeElement<Type>::setRight(TreeElement<Type> *right)
{
    
if(right == NULL)
        
return false;
    
this->rightElement = right;
    
return true;
}


template 
<class Type>
bool TreeElement<Type>::setElementData(Type &elementData)
{
    
this->elementData = elementData;
    
return true;
}


#endif

Tree.h:
#include "TreeElement.h"
#include 
<iostream>
#include 
<time.h>
#include 
<list>


#ifndef TREE_H
#define TREE_H

template 
<class Type>
class Tree
{
private:
    TreeElement
<Type> *boot;
    
int deep;
    
int elementCount;
    std::list
<Type> mylist;
    
void access(TreeElement<Type> *boot);
    
void deleteTree(TreeElement<Type> *boot);
public:
    Tree();
    
bool addElement(Type &data);
    
bool removeElement(Type &data);
    
int getDeep();
    
int getElementCount();
    std::list
<Type> accessTree();
    
~Tree();
}
;



template
<class Type>
Tree
<Type>::Tree()
{
    
this->boot = NULL;
    
this->deep = 0;
    
this->elementCount = 0;
    std::list
<Type> mylist;
}


template
<class Type>
bool Tree<Type>::addElement(Type &data)
{
    TreeElement
<Type> *current,*element;
    current
=boot;
    element 
= new TreeElement<Type>(data);
    
if(current == NULL)
    
{
        boot 
= element;
        elementCount
++;
        
return true;
    }

    
while(current!=NULL)
    
{
        srand( (unsigned)time( NULL ) );
        
if(rand()%2 == 0)
        
{
            
if(current->getLeft()!= NULL)
            
{
                current 
= current->getLeft();
            }

            
else
            
{
                current
->setLeft(element);
                elementCount
++;
                
return true;
            }

        }

        
else
        
{
            
if(current->getRight()!= NULL)
            
{
                current 
= current->getRight();
            }

            
else
            
{
                current
->setRight(element);
                elementCount
++;
                
return true;
            }

        }

    }

    
return true;
}


template
<class Type>
bool Tree<Type>::removeElement(Type &data)
{
    
return true;
}


template
<class Type>
int Tree<Type>::getDeep()
{
    
return deep;
}


template
<class Type>
int Tree<Type>::getElementCount()
{
    
return elementCount;
}


template
<class Type>
std::list
<Type> Tree<Type>::accessTree()
{
    access(boot);
    
return mylist;
}


template
<class Type>
void Tree<Type>::access(TreeElement<Type> *curr)
{
    
if(curr == NULL)
        
return;
    access(curr
->getLeft());
    mylist.push_back(curr
->getElementData());
    access(curr
->getRight());
}


template
<class Type>
Tree
<Type>::~Tree()
{
    deleteTree(boot);
}


template
<class Type>
void Tree<Type>::deleteTree(TreeElement<Type> *curr)
{
    
if(curr == NULL)
        
return;
    deleteTree(curr
->getLeft());
    deleteTree(curr
->getRight());
    delete curr;
}


#endif

测试代码:
test.cpp:
#include <iostream>
#include 
"Tree.h"

int main()
{
    
using namespace std;
    
int i=0;
    Tree
<int> tree;
    
int a=3,b=4,c=9,d=12,e=2,f=27,g=102;
    tree.addElement(a);
    tree.addElement(b);
    tree.addElement(c);
    tree.addElement(d);
    tree.addElement(e);
    tree.addElement(f);
    tree.addElement(g);
    list
<int> mylist(tree.accessTree());
    
while(!mylist.empty())
    
{
        cout
<<mylist.front()<<",";
        mylist.pop_front();
    }

    
return 1;
}
原创粉丝点击