前言
线索化二叉树就是将二叉树转换为双向链表的过程,也就是从非线性到线性的转化,对于结点的先后访问次序每次都去遍历的话效率太低,所以得引入双向链表来反映某种二叉树的遍历次序,利用结点的right指针指向遍历中的后继结点,利用结点的left指针指向遍历中的前驱结点,那么如何在遍历时记录结点间的访问次序,我们可以使用队列来进行操作,遍历结束后队列记录了访问次序,循环访问队列连接队列中的结点,如下图所示
这里还需要引入二叉树的层次遍历,层次遍历算法的步骤有以下4步
1.将根节点压入队列中
2.访问队头元素指向的二叉树结点
3.队头元素弹出,将队头元素的孩子压入队列中
4.判断队列是否为空
我们需要准备两个队列,tmp队列用来搬运二叉树的结点,queue队列用来保存二叉树层次遍历后的结果,也就是对应图1的的队列,它的具体操作流程如下所示
代码如下
void LevelOrderTraversal(BTreeNode<T>* node,LinkQueue<BTreeNode<T>*>& queue)
{
void LevelOrderTraversal(BTreeNode<T>* node,LinkQueue<BTreeNode<T>*>& queue)
{
if(node!=NULL)
{
LinkQueue<BTreeNode<T>*> tmp;
tmp.add(node);
while(tmp.length()>0)
{
BTreeNode<T>* n = tmp.front();
if(n->l_pointer!=NULL)
{
tmp.add(n->l_pointer);
}