什么是线索化二叉树?
-将二叉树转换为双向链表的过程(非线性 -> 线性)
-能够反映某种二叉树的遍历次序(结点的先后访问次序)
·利用结点的right指针指向遍历中的后继结点
·利用结点的left指针指向遍历中的前驱结点
目标
-新增功能函数 traversal(order,queue)
-新增遍历方式BTTraversal::LevelOrder;
-新增公有函数BTreeNode<T>* thread(BTTraversal order)
-消除遍历和线索化的代码冗余(代码重构)
层次遍历算法小结:
1.将根结点压入队列中
2.访问队头元素指向的二叉树结点
3.队头元素弹出,将队头元素的孩子压入队列中
4.判断队列是否为空(非空:转2,空:结束)
循环 | tmp队列 | queue队列 |
初始 | 1 | |
i = 1 | 2,3 | 1, |
i = 2 | 3,4,5 | 1,2 |
i = 3 | 4,5,6,7 | 1,2,3 |
i = 4 | 5,6,7,8,9 | 1,2,3,4, |
i = 5 | 6,7,8,9,10 | 1,2,3,4,5 |
i = 6 | 7,8,9,10 | 1,2,3,4,5,6 |
i = 7 | 8,9,10 | 1,2,3,4,5,6,7 |
i = 8 | 9,10 | 1,2,3,4,5,6,7,8 |
void levelOrderTraversal(BTreeNode<T>* node,LinkQueue<BTreeNode<T>*>& queue)
{
if(node != NULL)
{
LinkQueue<BTreeNode<T>*> tmp;
tmp.add(root());
while(tmp.length() > 0)
{
BTreeNode<T>* n = tmp.front();
if(n->left != NULL)
{
tmp.add(n->left);
}
if(n->right != NULL)
{
tmp.add(n->right);
}
tmp.remove();
queue.add(n);
}
}
}
函数接口设计
-BTreeNode<T>* thread(BTTraversal order)
·根据参数order选择线索化的次序(先序,中序,后序,层次)
·返回值线索化之后指向链表首结点的指针
·线索化执行结束之后对应的二叉树变为空树
BTreeNode<T>* thread(BTTraversal order)
{
BTreeNode<T>* ret = NULL;
LinkQueue<BTreeNode<T>*> queue;
traversal(order,queue);
ret = connect(queue);
this->m_root = NULL;
m_queue.clear();
return ret;
}
总结:
-线索化石将二叉树转换为双向链表的过程
-线索化之后结点间的先后次序符合某种遍历次序
-线索化操作将破坏原二叉树结点间的父子关系
-线索化之后二叉树将不再管理结点的声明期