多叉樹儲存的方式:
採用鍊錶的方式維護子節點,每個結點的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一樣遍歷。想要以相同的方式遍歷不同型別的聚合物件,首先就要有乙個相同的介面方法來統一獲取,...