线索二叉树

线索二叉树实质上就是将一颗二叉树转化成二叉链表的过程,将二叉树的一些空指针给利用起来,为了达到这个目的,我们使用中序遍历线索化的办法。

也就是要将每个节点的指针全部存储一个值,为了区分线索和真正的子节点,我们就需要一个flag,将线索和子节点区分开来,具体代码如下。

#define thread 1
#define child 0

//我们将原本的节点扩充一下,来区分指针存储的是什么
struct treeNode
{
    int data;
    treeNode* lChild;
    treeNode* rChild;
    int lTag;
    int rTag;
};

//定义一个全局变量,指向上一次遍历过的节点
//我们需要在每次递归线索化的时候改变这个值
//也可以不需要全局变量,改用引用
treeNode* preNode;

//中序线索化二叉树
void cueingTree(treeNode* node)
{
    if(node != NULL)
    {
        cueingTree(node->lChild);
//如果当前节点的左子树节点是为NULL,则说明它可以用来存放这个节点的前驱
//即上次遍历过的节点
        if(node->lChild == NULL)
        {
            node->lTag = thread;
            node->lChild = preNode;
        }
//如果上个节点的右子树为NULL,说明可以存放这个节点的后继
//只有在知道了后继之后才能为前一个节点赋值
        if(preNode->rChild == NULL)
        {
            preNode->rTag = thread;
            preNode->rChild = node;
        }
//更新上次遍历过的节点
        preNode = node;
        if(node->rChild != node)
        {
            cueingTree(node->rChild);
        }
    }
}

//在有了线索二叉树之后,我们便可以使用迭代的方式来遍历二叉树
void inOrderTraversal()
{
    treeNode* currentNode = this->head->lChild;
    while(currentNode != this->head)
    {
        while(currentNode->lTag == child)
        {
            currentNode = currentNode->lChild;
        }
        cout << currentNode->data << "  ";
        while(currentNode->rTag == thread && currentNode->rChild != this->head)
        {
            currentNode = currentNode->rChild;
            cout << currentNode->data << "  ";
        }
        currentNode = currentNode->rChild;
    }
}

其实线索二叉树的建立过程,就是一次中序遍历的过程,在遍历过程中,对每一个节点进行线索化,如果有能利用到的空指针,就可以用来存放前驱后继。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原链接:理解线索二叉树|CloudWong 线索二叉树原理 遍历二叉树的其实就是以一定规则将二叉树中的结点排列成一...
    简Cloud阅读 12,641评论 1 16
  • 数据结构与算法--线索二叉树及其前序、中序遍历 二叉树如果某个结点没有左孩子或右孩子,则这个域就为空。如node....
    sunhaiyu阅读 7,787评论 4 16
  • 线索二叉树的原理 通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结...
    葛高召阅读 4,075评论 0 0
  • 线索二叉树的原理 通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结...
    Gaizka阅读 3,647评论 0 0
  • 线索二叉树的原理 通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结...
    少帅yangjie阅读 2,563评论 0 1