c++-关于多叉树中 迭代器使用的问题

问题描述

关于多叉树中 迭代器使用的问题

tree.h文件

 #include <iostream>
#include <list>
#include <algorithm>
using namespace std;  

struct TreeNode;
class Tree;
class Iterator;
typedef list<TreeNode*> List; 

TreeNode* clone(TreeNode*,List&,TreeNode*);

struct TreeNode{
   int _data;
   TreeNode* _parent;
   List _children;
   TreeNode(int,TreeNode*);
   void SetParent(TreeNode&);
   void InsertChildren(TreeNode&);
};  

class Tree{
public:  

   Tree();
   Tree(const Tree&);
   Tree(const int);
   Tree(const int,const list<Tree*>&);
   ~Tree();
   Tree& operator=(const Tree&);
   bool operator==(const Tree&);
   bool operator!=(const Tree&);      

   void Clear();
   bool IsEmpty()const;
   int Size()const;
   int Leaves();
   int Root()const;
   int Height();                      

   static bool IsRoot(Iterator);
   static bool isLeaf(Iterator);
   static Iterator Parent(Iterator);
   static int NumChildren(Iterator); 

   Iterator begin();
   Iterator end();
   friend class Iterator;
private:
   list<TreeNode*> _nodes;
   list<TreeNode*>::iterator LIt;
   int height(TreeNode*);
   int level(TreeNode*,Iterator);
};  

class Iterator{
   private:
    Tree* _tree;
    list<TreeNode*>::iterator _lit;
   public:
    Iterator();
    Iterator(const Iterator&);
    Iterator(Tree*,TreeNode*);
    Iterator(Tree*,list<TreeNode*>::iterator);
    void operator=(const Iterator&);
    bool operator==(const Iterator&);
    bool operator!=(const Iterator&);
    Iterator& operator++();
    Iterator operator++(int);
    int operator*()const;
    bool operator!();            

    typedef list<TreeNode*>::iterator List;
    friend class Tree;
};  

tree.cpp文件

 #include "tree.h"

TreeNode::TreeNode(int type= 0,TreeNode* Parent = 0)
{
 _data = type;
 _parent = Parent;
}

void TreeNode::SetParent(TreeNode& node)
{
 _parent = &node;
}

void TreeNode::InsertChildren(TreeNode& node)
{
 TreeNode* p = &node;
 _children.push_back(p);
}

Tree::Tree()
{

}

Tree::Tree(const int type)
{
 _nodes.push_back(new TreeNode(type));
}

Tree::Tree(const Tree& t)
{
 if(t._nodes.empty())return;
 clone(t._nodes.front(),_nodes,0);
}

Tree::Tree(const int type,const list<Tree*>& lit)
{
 TreeNode* root = new TreeNode(type);
 _nodes.push_back(root);
 list<Tree*>::const_iterator it;
 for(it = lit.begin();it!=lit.end();it++){
 if(!((*it)->_nodes.empty())){
   Tree* tp = new Tree(**it);
   TreeNode* p = tp->_nodes.front();
   root->_children.push_back(p);
   p->_parent = root;
   list<TreeNode*>::iterator lit1 = tp->_nodes.begin();
   list<TreeNode*>::iterator lit2 = tp->_nodes.end();
   list<TreeNode*>::iterator lit3 = _nodes.end();
   _nodes.insert(lit3,lit1,lit2);
 }
 }
}

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

Tree& Tree::operator =(const Tree & t)
{
 Clear();
 Tree* p = new Tree(t);
 _nodes = p->_nodes;
 return *this;
}

bool Tree::operator ==(const Tree& t)
{
 if(_nodes.size()!=t._nodes.size()){
 return false;
 }
 list<TreeNode*>::iterator it = _nodes.begin();
 list<TreeNode*>::const_iterator _it = t._nodes.begin();
 while(it!=_nodes.end()&&_it!=t._nodes.end()){
 if((*it)->_data!=(*_it)->_data){
   return false;
 }
 it++;
 _it++;
 }
 return true;
}

bool Tree::operator !=(const Tree& t)
{
 if(_nodes.size()!=_nodes.size()){
 return true;
 }
 else{
 list<TreeNode*>::iterator it = _nodes.begin();
     list<TreeNode*>::const_iterator _it = t._nodes.begin();
 while(it!=_nodes.end()&&_it!=t._nodes.end()){
   if((*it)->_data!=(*_it)->_data){
    return true;
   }
   it++;
   _it++;
 }
 return false;
 }
}

void Tree::Clear()
{
 for(list<TreeNode*>::iterator it = _nodes.begin();it!=_nodes.end();it++){
 delete* it;
 }
 _nodes.clear();
}

bool Tree::IsEmpty()const
{
 return _nodes.empty();
}

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

int Tree::Leaves()
{
 int i = 0;
 list<TreeNode*>::iterator it = _nodes.begin();
 while(it!=_nodes.end()){
 if((*it)->_children.size()==0){
   i++;
 }
 it++;
 }
 return i;
}

int Tree::Height()
{
 if(_nodes.size()!=0){
 TreeNode* TNode = _nodes.front();
 return height(TNode);
 }
 else{
 return -1;
 }
}

int Tree::height(TreeNode* node)
{
 if(!node){
 return -1;
 }
 else{
 list<TreeNode*> plist = node->_children;
 if(plist.size()==0){
   return 0;
 }
 int hA = 0;
 for(list<TreeNode*>::iterator it = plist.begin();it!=plist.end();it++){
  int hB = height(*it);
   if(hB>hA){
    hA = hB;
   }
 }
 return hA+1;
 }
}

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

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

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

bool Tree::IsRoot(Iterator it)
{
 TreeNode p = *it;
 if(p._parent == 0){
 return true;
 }
 return false;
}

bool Tree::isLeaf(Iterator it)
{
 TreeNode p = *it;
 if(p._children.size() == 0){
 return true;
 }
 return false;
}

Iterator Tree::Parent(Iterator it)
{
 TreeNode p = *it;
 Tree* t = it._tree;
 Iterator Ite(t,p._parent);
 return Ite;
}

int Tree::NumChildren(Iterator it)
{
 TreeNode p = *it;
 return (int)p._children.size();
}

Iterator::Iterator()
{
}

Iterator::Iterator(const Iterator& it)
{
 _tree = it._tree;
 _lit = it._lit;
}

Iterator::Iterator(Tree* t, TreeNode* n)
{
 _tree = t;
 list<TreeNode*>& nodes = _tree->_nodes;
 _lit = find(nodes.begin(),nodes.end(),n);//<algorithm> Members
}

Iterator::Iterator(Tree * t, list<TreeNode*>::iterator lt)
{
 _tree = t;
 _lit = lt;
}

void Iterator::operator =(const Iterator& it)
{
 _tree = it._tree;
 _lit = it._lit;
}

bool Iterator::operator ==(const Iterator & it)
{
 return _tree == it._tree && _lit == it._lit;
}

bool Iterator::operator !=(const Iterator & it)
{
 return _tree != it._tree || _lit != it._lit;
}

Iterator& Iterator::operator ++()
{
 ++_lit;
 return *this;
}

Iterator Iterator::operator ++(int)
{
 Iterator it(*this);
 ++_lit;
 return it;
}

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

bool Iterator::operator !()
{
 return _lit == _tree->_nodes.end();
}

TreeNode* clone(TreeNode* node,List& nodes,TreeNode* nodep)
{
 TreeNode* cp = new TreeNode(node->_data,nodep);
 nodes.push_back(cp);
 List& l = node->_children;
 List& cl = cp->_children;
 for(list<TreeNode*>::iterator lt = l.begin();lt!=l.end();lt++){
 cl.push_back(clone(*lt,nodes,cp));
 }
 return cp;
}

编译后,这里报错
tree.cpp: In static member function static bool Tree::IsRoot(Iterator)?
tree.cpp:189: error: conversion from int?to non-scalar type TreeNode?requested
tree.cpp: In static member function static bool Tree::isLeaf(Iterator)?
tree.cpp:198: error: conversion from int?to non-scalar type TreeNode?requested
tree.cpp: In static member function static Iterator Tree::Parent(Iterator)?
tree.cpp:207: error: conversion from 鈏nt?to non-scalar type 釺reeNode?requested
tree.cpp: In static member function 鈙tatic int Tree::NumChildren(Iterator)?
tree.cpp:216: error: conversion from int?to non-scalar type TreeNode?requested

为什么会这样报错,应该怎么改正?

时间: 2024-08-24 02:34:50

c++-关于多叉树中 迭代器使用的问题的相关文章

C++中迭代器移动和运算符比较的问题

问题描述 C++中迭代器移动和运算符比较的问题 C++中,迭代器iter+1,表示的是向begin方向移动一个位置还是end方向移动? 何为向前移动?向后移动? C++Primer第五版中,迭代器的关系运算符中,如果某迭代器指向的容器位置在另一个迭代器所指位置之前,则说明前者小于后者. 请问怎么理解? 解决方案 取决于迭代器,缺省是前向迭代器,这样加一就是超end方向.

数据结构例程——线索化二叉树(中序)

本文是数据结构基础系列(6):树和二叉树中第14课时线索二叉树的例程. #include <stdio.h> #include <malloc.h> #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; int ltag,rtag; //增加的线索标记 struct node *lchild; struct node *rchild; } TBTNode; void Creat

深入解读Lua中迭代器与泛型for的使用_Lua

泛型for原理 迭代器是一种可以遍历集合中所有元素的机制,在Lua中通常将迭代器表示为函数,每调用一次函数,就返回集合中"下一个"元素.每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置及如何步进到下一个位置,closure就可以完成此项工作.下面的示例是列表的一个简单的迭代器: function values(t) local i = 0 return function() i = i + 1; return t[i] end end 循环调用: t = {10

Java使用设计模式中迭代器模式构建项目的代码结构示例_java

迭代器(Iterator)模式,又叫做游标(Cursor)模式.GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节.  迭代器模式由以下角色组成:迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口. 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置. 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口. 具体容器角色(Concrete

举例讲解Ruby中迭代器Iterator的用法_ruby专题

Iterator 定义 A Ruby iterator is simple a method that can invoke a block of code.         Block 一般是跟着 method 出现的, 并且 block 中的代码不一定会执行         如果 method 中有 yield, 那么它的block 中的代码会被执行         Block 可以接收参数,和返回 value def two_times yield yield end two_times

JavaScript中的迭代器和生成器详解

 处理集合里的每一项是一个非常普通的操作,JavaScript提供了许多方法来迭代一个集合,从简单的for和for each循环到 map(),filter() 和 array comprehensions(数组推导式).在JavaScript 1.7中,迭代器和生成器在JavaScript核心语法中带来了新的迭代机制,而且还提供了定制 for-in 和 for each 循环行为的机制. 迭代器 迭代器是一个每次访问集合序列中一个元素的对象,并跟踪该序列中迭代的当前位置.在JavaScript

设计模式之iterator模式到STL中iterator迭代器

设计模式之iterator模式到STL中iterator迭代器 近日看<设计模式:可复用面向对象软件的基础>一书中23种模式中就有iterator迭代模式,且篇幅颇大.机缘巧合.我在分析STL代码结构的时候,同样发现iterator迭代器,且占据相当大的地位. 从设计模式的角度来看iterator模式 ü     意图 提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露对象的内部表示.我想GOF 的意图这次说的很明白了,就是我想遍历一个聚合对象.但又隐藏内部实现.该怎么办呢?本模式主要

JavaScript中的迭代器和生成器详解_javascript技巧

处理集合里的每一项是一个非常普通的操作,JavaScript提供了许多方法来迭代一个集合,从简单的for和for each循环到 map(),filter() 和 array comprehensions(数组推导式).在JavaScript 1.7中,迭代器和生成器在JavaScript核心语法中带来了新的迭代机制,而且还提供了定制 for-in 和 for each 循环行为的机制. 迭代器 迭代器是一个每次访问集合序列中一个元素的对象,并跟踪该序列中迭代的当前位置.在JavaScript中

Ruby中Block和迭代器的使用讲解_ruby专题

我们来简单地描述Ruby的一个独特特性.Block,一种可以和方法调用相关联的代码块,几乎就像参数一样.这是一个不可思议的功能强大的特性. 可以用Block实现回调(但它比Java的匿名内部(anonymous inner)类更简单),传递一组代码(但它远比c的函数指针灵活),以及实现迭代器. Block只是在花括号或者do...end之间的一组代码. {puts "Hello"} #this is a block do ### club.enroll(person) #and so