稀样 2015-11-02 08:00
浏览 794

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

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

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

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
    • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
    • ¥16 mybatis的代理对象无法通过@Autowired装填
    • ¥15 可见光定位matlab仿真
    • ¥15 arduino 四自由度机械臂
    • ¥15 wordpress 产品图片 GIF 没法显示
    • ¥15 求三国群英传pl国战时间的修改方法
    • ¥15 matlab代码代写,需写出详细代码,代价私
    • ¥15 ROS系统搭建请教(跨境电商用途)
    • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。