///Tree.cpp 文件#include "stdafx.h"#include "Tree.h"//***** 下面是对于TreeNode结构体的定义实现*****///TreeNode::TreeNode(inttype =0, TreeNode* Parent =0) {

_data = type;

_parent = Parent;

}voidTreeNode::SetParent(TreeNode& node) {

_parent = &node;

}voidTreeNode::InsertChildren(TreeNode& node) {

TreeNode* p = &node;

_children.push_back(p);

}//***** 下面是对于Tree类的定义实现*****///Tree::Tree() {

}

Tree::Tree(constinttype) {

_nodes.push_back(newTreeNode(type));

}

Tree::Tree(constTree& t) {if(t._nodes.empty())return;

clone(t._nodes.front(), _nodes,0);

}

Tree::Tree(constinttype,constlist& lit) {

TreeNode* root =newTreeNode(type);//建立根节点_nodes.push_back(root);//放入树中list::const_iterator it;for(it = lit.begin(); it != lit.end(); it++) {if(!((*it)->_nodes.empty())) {//如果当前节点元素不为空Tree* tp =newTree(**it);

TreeNode* p = tp->_nodes.front();

root->_children.push_back(p);//设置根的子节点p->_parent = root;//设置节点的父节点为根list::iterator lit1 = tp->_nodes.begin();list::iterator lit2 = tp->_nodes.end();list::iterator lit3 = _nodes.end();

_nodes.insert(lit3, lit1, lit2);

}

}

}

Tree::~Tree() {for(list::iterator it = _nodes.begin(); it != _nodes.end(); it++) {delete* it;

}

}

Tree& Tree::operator=(constTree & t) {

Clear();

Tree* p =newTree(t);

_nodes = p->_nodes;return*this;

}boolTree::operator==(constTree& t) {if(_nodes.size() != t._nodes.size()) {returnfalse;

}list::iterator it = _nodes.begin();list::const_iterator _it = t._nodes.begin();while(it != _nodes.end() && _it != t._nodes.end()) {if((*it)->_data != (*_it)->_data) {returnfalse;

}

it++;

_it++;

}returntrue;

}boolTree::operator!=(constTree& t) {if(_nodes.size() != _nodes.size()) {returntrue;

}else{list::iterator it = _nodes.begin();list::const_iterator _it = t._nodes.begin();while(it != _nodes.end() && _it != t._nodes.end()) {if((*it)->_data != (*_it)->_data) {returntrue;

}

it++;

_it++;

}returnfalse;

}

}voidTree::Clear() {for(list::iterator it = _nodes.begin(); it != _nodes.end(); it++) {delete* it;

}

_nodes.clear();

}boolTree::IsEmpty()const{return_nodes.empty();

}intTree::Size()const{return(int)_nodes.size();

}intTree::Leaves() {inti =0;list::iterator it = _nodes.begin();while(it != _nodes.end()) {if((*it)->_children.size() ==0) {

i++;

}

it++;

}returni;

}intTree::Height() {if(_nodes.size() !=0) {

TreeNode* TNode = _nodes.front();returnheight(TNode);

}else{return-1;//判断为空树}

}intTree::height(TreeNode* node) {if(!node) {return-1;

}else{listplist = node->_children;if(plist.size() ==0) {return0;

}inthA =0;for(list::iterator it = plist.begin(); it != plist.end(); it++) {inthB = height(*it);if(hB>hA) {

hA = hB;

}

}returnhA +1;

}

}

Iterator Tree::begin() {returnIterator(this, _nodes.begin());

}

Iterator Tree::end() {returnIterator(this, _nodes.end());

}intTree::Root()const{return(*_nodes.begin())->_data;

}boolTree::IsRoot(Iterator it) {

TreeNode p = *it;if(p._parent ==0) {returntrue;

}returnfalse;

}boolTree::isLeaf(Iterator it) {

TreeNode p = *it;if(p._children.size() ==0) {returntrue;

}returnfalse;

}

Iterator Tree::Parent(Iterator it) {

TreeNode p = *it;

Tree* t = it._tree;

Iterator Ite(t, p._parent);returnIte;

}intTree::NumChildren(Iterator it) {

TreeNode p = *it;return(int)p._children.size();

}//***** 下面是对于Tree::Iterator类的定义实现*****///Iterator::Iterator() {

}

Iterator::Iterator(constIterator& it) {

_tree = it._tree;

_lit = it._lit;

}

Iterator::Iterator(Tree* t, TreeNode* n) {

_tree = t;list& nodes = _tree->_nodes;

_lit = find(nodes.begin(), nodes.end(), n);// Members}

Iterator::Iterator(Tree * t,list::iterator lt) {

_tree = t;

_lit = lt;

}voidIterator::operator=(constIterator& it) {

_tree = it._tree;

_lit = it._lit;

}boolIterator::operator==(constIterator & it) {return_tree == it._tree && _lit == it._lit;

}boolIterator::operator!=(constIterator & it) {return_tree != it._tree || _lit != it._lit;

}

Iterator& Iterator::operator++() {

++_lit;return*this;

}

Iterator Iterator::operator++(int) {

Iterator it(*this);

++_lit;returnit;

}intIterator::operator*()const{return((*_lit)->_data);

}boolIterator::operator!() {return_lit == _tree->_nodes.end();

}//Clone函数TreeNode* clone(TreeNode* node, List& nodes, TreeNode* nodep) {

TreeNode* cp =newTreeNode(node->_data, nodep);

nodes.push_back(cp);

List& l = node->_children;

List& cl = cp->_children;for(list::iterator lt = l.begin(); lt != l.end(); lt++) {

cl.push_back(clone(*lt, nodes, cp));

}returncp;

}

php 多叉树实现,一个简单的多叉树C++实现相关推荐

  1. 聊聊高并发(十六)实现一个简单的可重入锁

    可重入锁指的是假设一个线程已经获得了一个锁,那么它能够多次进入这个锁,当然前提是线程须要先获得这个锁. 可重入锁是最常使用的锁.Java的内置锁就是可重入锁,使用synchronizedkeyword ...

  2. 用php做一个简单的汇率,vue实现简单实时汇率计算功能

    最近在自己摸索vue的使用,因为相对于只是去看教程和实例,感觉不如自己动手写一个demo入门来的快.刚好看到小程序中有一个简单但是很精致的应用极简汇率,而且它的表现形式和vue的表现形式很像,于是想着 ...

  3. python编写赛车游戏单机版_使用Python中OrderedDict模拟一个简单的竞速游戏排名

    上一篇,我们梳理了Python中关于字典排序的一些常用方法(杂乱无章的数据结构如何进行排序,简明讲述Python字典排序那些事).其中,我们讲到了Python的collections模块中的Order ...

  4. 编写一个最简单的.php,学习猿地- 说明 如果我们要编写一个简单的PHP脚本,需要学习哪些...

    说明 如果我们要编写一个简单的 PHP 脚本,需要学习哪些基础知识呢? PHP 基础 PHP 脚本可放置于文档中的任何位置. 标准 的 PHP 脚本以 <?php 开头,以 ?> 结尾: ...

  5. 【javamatlab】以一个简单的例子实现java和matlab混编

    目录 使用环境: MATLAB: matlab代码: 将matlab代码打包: eclipse: jar包配置: 使用jar包: 使用环境: jdk8(ide使用eclipse2019-6).matl ...

  6. 一个简单的slider滑块组件

    2019独角兽企业重金招聘Python工程师标准>>> 我们先来看一张图片: 要实现这样的效果我们有很多种方法,比如直接使用<input type="range&qu ...

  7. 用 cooking 搭建一个简单又优雅的 Vue 项目开发环境 (入门篇)

    本文适合 Vue 的初学者,以及对 webpack 不熟悉的同学阅读.前提是你要会用基本的命令行. Node 和 NPM,以及掌握 ES2015 的基础知识.本文都是在 macOS 环境下运行,要求使 ...

  8. Directx11教程(6) 画一个简单的三角形(2)

    在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变,如下图所示: 这是因为我们改变了窗口大小,但后缓冲大小在程序初始化时候, ...

  9. python如何编写数据库_如何在几分钟内用Python编写一个简单的玩具数据库

    python如何编写数据库 MySQL, PostgreSQL, Oracle, Redis, and many more, you just name it - databases are a re ...

最新文章

  1. 企业研发管理工具应用分析
  2. python center函数_python pandas移动窗口函数rolling的用法
  3. 搜索引擎是如何判断网站质量的?
  4. android webview重绘,Android-怎么判断android中WebView滑动到了低端
  5. 三种方式在CentOS 7搭建KVM虚拟化平台
  6. AI应用开发实战系列之二:从零开始搭建macOS开发环境
  7. 作为面向事务的客户服务器协议,湖南大学《计算机网络》实验报告.doc
  8. qt 程序异常结束_【心电国际指南2009专家解读】浦介麟 冉玉琴老师:QT 间期的规范化测量及其意义...
  9. mysql常见字符串处理函数
  10. caffe face 实现人脸相似度识别 c++版本
  11. 介绍一款网页翻译插件
  12. matlab三机九节点,matlab三机九节点电力系统仿真(带程序).doc
  13. 饥荒联机一直显示正在启动服务器,饥荒联机版一直正在启动服务器 | 手游网游页游攻略大全...
  14. python中实现简单抽样的函数
  15. 二元二次方程例题_二元二次方程练习题.doc
  16. 什么是:arguments
  17. Anaconda中的spyder安装Terminal插件
  18. 1231231312
  19. 笔记本完全卸载自带键盘
  20. 计算机图形和游戏技术专业,宾夕法尼亚大学计算机图形和游戏技术学理学硕士研究生申请要求及申请材料要求清单...

热门文章

  1. 删除-ARMV8-V9-ATF-FFA学习笔记目录-2021-08
  2. MySQL的索引及优化方案
  3. 校验数字签名防止apkP二次打包
  4. (50)补充内容:SSDT HOOK 模板
  5. Android Studio 1.1.0 导入eclipse android project
  6. 1.8 深入解析new运算符
  7. 1.6 this关键字详解(3种用法)
  8. 项目: 打字母游戏【c++/c】
  9. 项目: 贪吃蛇(C语言)
  10. 萌新发问:MyBatis日志到底是如何做到兼容所有常用日志框架的?