C 迭代器模式封裝多叉樹

2022-06-20 17:33:13 字數 3388 閱讀 3289

多叉樹儲存的方式:

採用鍊錶的方式維護子節點,每個結點的child指標指向子節點鍊錶的首節點。通過next指標即可遍歷子節點鍊錶。

採用迭代器模式的設計思路,封裝了多叉樹dfs遍歷介面:iterator_node以及bfs遍歷介面:iterator_leval_node。

iterator_node的實現思路:

從head節點開始遍歷多叉樹。通過tree.begin()獲取迭代器。過載++運算子,可以通過以下方式遍歷多叉樹:

for (auto it = tree.begin(); !it.empty(); it++)
其中過載++運算子呼叫了iterator_node的私有成員函式next(),next的實現思路如下:

按照以下順序遍歷:

1. 如果child指標不為空,將iterator_node儲存的point指標變為this_>child,直接return。

2. 如果next指標不為空,將iterator_node儲存的point指標變為this_>next,直接return。

3. child和next都為空時,表明無法繼續向下遍歷,只能向上回滾,呼叫next_up函式。

next_up函式的邏輯為:

1. 有兄弟節點則將point設為兄弟節點

2. 沒有兄弟節點,如果父節點不為空繼續向上查詢,呼叫next_up();

3. 父親節點和兄弟節點都為空,遍歷結束,返回nullptr。

iterator_leval_node的實現思路:

在迭代器內部維護乙個佇列,每次++操作都將節點的子節點入隊,取出隊首的節點,當隊列為長度為0時,表明遍歷結束返回nullptr。

#include #include 

#include

using

namespace

std;

class

data

};//

定義節點

template class

node

};template

class

iterator_node

//沒有兄弟節點繼續向上查詢

if (point->parent !=nullptr)

//父親節點為空返回空

return iterator_node(nullptr);

}//獲取下乙個迭代器

iterator_nodenext() const

//有兄弟節點返回兄弟節點

if (point->next !=nullptr)

//沒有子節點和兄弟節點執行next_up向上查詢

if (point->parent !=nullptr)

}//獲取data

t* get_date() const

public

: iterator_node() : point(nullptr) {}

iterator_node(node

*n) : point(n) {}

//是否為空

bool empty() const

//獲取父節點

iterator_nodefather() const

//獲取子節點列表

vector> children() const

return

res;

}//獲取兄弟節點列表

vector> brothers() const

//過載*運算子

t operator*() const

//過載++運算子

iterator_nodeoperator++()

iterator_node

& operator++(int

)

//過載->運算子

t* operator->() const

template

friend

class

polytree;

};template

class iterstor_leval_node : public iterator_node

return

true

; }

return

false

; }

void

get_next()

else

if(tmp_queue.empty())

else

}public

:

//建構函式

iterstor_leval_node(node* n) //

: iterator_node::point(n)

iterstor_leval_node

(iterstor_leval_node* tmp) : iterator_node::point(tmp->point), tmp_queue(tmp->tmp_queue) {}

//過載++運算子

iterstor_leval_nodeoperator++()

iterstor_leval_node

& operator++(int

)

template

friend

class

polytree;

};template

class

polytree

iterator_node

begin()

iterstor_leval_node

leval_begin()

//插入節點

void add(iterator_nodeparent, t*t)

if (parent.children().size() == 0

)

else

p->next = new node(t);

p->next->parent =parent.point;}}

//新增根節點

void add(t*t)

}//移除節點

void earse(iterator_nodeit)

if (p->parent->child ==p)

else

p1->next = p->next;}}

};int

main()

cout

<< "

bfs:

"<

for (auto it = tree.leval_begin(); !it.empty(); it++)

intx;

cin >>x;

return0;

}

c 迭代器模式

不能直接std 的迭代器代替麼。iterator 定義迭代器訪問和遍歷元素的介面 concreteiterator 實現具體的迭代器 aggregate 定義的容器,建立相應迭代器物件的介面 concreteaggregate 具體的容器實現建立相應迭代器的介面,該操作返回concreteitera...

C 設計模式 迭代器模式

迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部表示。迭代器模式結構圖 iterator迭代器抽象類 class iterator public virtual object first 0 virtual object next 0 virtual ...

C 設計模式 迭代器模式

迭代器模式 提供一種方法順序訪問乙個聚合物件中的各個元素,而又不暴露其內部的結構 每一種資料結構 包括自定義 遍歷自身內部的資料方式都是不同的。但是我們又希望和常規的遍歷方式一樣呼叫,就如for和foreach一樣遍歷。想要以相同的方式遍歷不同型別的聚合物件,首先就要有乙個相同的介面方法來統一獲取,...