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

什么是线索化二叉树?

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

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

·利用结点的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;
    }

总结:

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

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_29962483/article/details/84136226