二叉树的线索化

本文介绍了二叉树的线索化过程,即将其转化为双向链表以提高遍历效率。通过层次遍历的方法记录结点的访问次序,并使用队列辅助操作。在层次遍历的基础上,详细阐述了线索化设计的步骤,包括接口设计、连接结点的`connect`函数,以及线索化操作的完整代码实现。
摘要由CSDN通过智能技术生成

前言

线索化二叉树就是将二叉树转换为双向链表的过程,也就是从非线性到线性的转化,对于结点的先后访问次序每次都去遍历的话效率太低,所以得引入双向链表来反映某种二叉树的遍历次序,利用结点的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);
                 }
                 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值