利用C++模板生成随机二叉树
来源:互联网 发布:淘宝客服工作流程视频 编辑:程序博客网 时间:2024/06/06 02:45
构造一个生成随机二叉树的类,二叉树的结点 数、结点所存放的数据类型等都可以是任意的:
TreeElement.h描述的是二叉树的结点信息,Tree.h描述二叉树本身,代码如下:
TreeElement.h:
Tree.h:
测试代码:
test.cpp:
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
#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
#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;
}
#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;
}
- 利用C++模板生成随机二叉树
- 利用马尔可夫链生成随机文本
- 利用随机函数生成随机数
- 二叉树利用C语言表述
- c语言中,随机数的生成,随机ID的原理及利用
- C实例---生成随机数组
- C/C++生成二叉树并搜索
- 最小生成树---prim模板(二叉堆优化)
- 利用struts生成随机验证码(JAVA)
- 如何利用python生成随机验证码?
- JAVA 利用UUID生成随机字符串
- C语言操作随机生成的树结构
- 【JAVA生成PDF】利用模板生成PDF
- 生成关键字是1~N的随机二叉查找树的函数
- 数据结构与算法分析生成N节点随机二叉查找树
- 随机二叉搜索树 Treap
- 【c++】c++模板类,实现二叉树非递归遍历
- 二叉树1:广义表形式生成二叉链表形式,利用队列输出层次结构
- c# 一个中国农历时间的类
- 要发布新版的私人磁盘了。
- Winpcap的Kernel Buffer和其他的Buffer设置
- C#可定制的数据库备份和恢复程序
- 好友看到的进来~~~
- 利用C++模板生成随机二叉树
- Jbpm3.1中setVariable()和setVariableLocally()的区别
- GParted -- 实用的分区工具
- 用cx_Freeze把python打包成exe可执行文件
- Freewheel Frame
- Random.org -- 真正的随机数生成器
- MyEclipse 6.0.1|Dreamweaver8|SQLyog|UltraEdit-32|mysql-Front学习软件注册码收藏 (仅供学习之用)
- GNOME Terminator -- 任意分割你的终端窗口
- 手动制作python的exe可执行程序