二叉树的遍历
-二叉树的遍历(Traversing Binay Tree)是指从根节点触发,按照某种次序一次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次。
通用树结构的层次遍历算法是否可以用在二叉树结构上?
如果可以,代码需要做怎样的改动?
提供一组遍历相关的函数,按层次访问二叉树中的数据元素。
函数 | 功能说明 |
begin() | 初始化,准备进行遍历访问 |
next() | 移动游标,指向下一个结点 |
current() | 获取游标所指向的数据元素 |
end() | 判断游标是否到达尾部 |
层次遍历算法
-原谅:class LinkQueue<T>;
-游标:LInkQueue<T>::front();
-思想:
·begin() -> 将根节点压入队列中
·current()->访问队头元素指向的数据元素
·next()->队头元素弹出,将队头元素的孩子压入队列中(核心)
·end()->判断队列是否为空
层次遍历算法示例
函数调用 | 队列状态 | 出队结点 |
begin() | 1 | |
next() | 2,3 | 1 |
next() | 4,5,6,7 | 3 |
next() | 5,6,7,8,9 | 4 |
next() | 6,7,8,9,10 | 5 |
next() | 7,8,9,10 | 6 |
next() | 8,9,10 | 7 |
next() | 9,10 | 8 |
... | ... | ... |
bool begin()
{
bool ret = (root()!= NULL);
if(ret)
{
m_queue.clear();
m_queue.add(root());
}
return ret;
}
bool end()
{
return (m_queue.length() == 0);
}
bool next()
{
bool ret = (m_queue.length() > 0);
if(ret)
{
BTreeNode<T>* node = m_queue.front();
m_queue.remove();
if(node->left != NULL)
{
m_queue.add(node->left);
}
if(node->right != NULL)
{
m_queue.add(node->right);
}
}
return ret;
}
T current()
{
if(!end())
{
return m_queue.front()->value;
}
else
{
//抛出异常
}
}
for(bt.begin();!bt.end();bt.next())
{
cout << bt.current() << " ";
}