数据结构 笔记:二叉树的线索化实现

什么是线索化二叉树?

-将二叉树转换为双向链表的过程(非线性 -> 线性)

-能够反映某种二叉树的遍历次序(结点的先后访问次序)

·利用结点的right指针指向遍历中的后继结点

·利用结点的left指针指向遍历中的前驱结点

目标

-新增功能函数 traversal(order,queue)

-新增遍历方式BTTraversal::LevelOrder;

-新增公有函数BTreeNode<T>* thread(BTTraversal order)

-消除遍历和线索化的代码冗余(代码重构)

层次遍历算法小结:

1.将根结点压入队列中

2.访问队头元素指向的二叉树结点

3.队头元素弹出,将队头元素的孩子压入队列中

4.判断队列是否为空(非空:转2,空:结束)

循环tmp队列queue队列
初始1 
i = 12,31,
i = 23,4,51,2
i = 34,5,6,71,2,3
i = 45,6,7,8,91,2,3,4,
i = 56,7,8,9,101,2,3,4,5
i = 67,8,9,101,2,3,4,5,6
i = 78,9,101,2,3,4,5,6,7
i = 89,101,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;
    }

总结:

-线索化石将二叉树转换为双向链表的过程

-线索化之后结点间的先后次序符合某种遍历次序

-线索化操作将破坏原二叉树结点间的父子关系

-线索化之后二叉树将不再管理结点的声明期

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值