ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

线索二叉树C++实现

2020-02-24 18:58:32  阅读:241  来源: 互联网

标签:node src wnd svg C++ prior 二叉树 线索


线索二叉树C++实现

什么是线索二叉树

线索二叉树主要体现在二叉树的 DFS 中, 也就是前序, 中序, 与后序遍历, 我们以中序遍历为例, 讲述线索二叉树线索的原理.

线索主要表现在, DFS 的过程中记录遍历的前驱与后继节点, 可以用下面的图来表示节点,

lbitlbitlchildlchilddatadatarchildrchildrbitrbit

代码表示就是

struct Tree{
    Tree *left, *right;
    int number;
    int lbit, rbit;  // 用于记录节点的左右指针是前驱还是后继
};

首先, 我们先来回顾一下二叉树的中序遍历, (本文讲述的以下算法均是基于中序遍历的),

二叉树的中序遍历:

用代码表示就是:

void Midorder(Tree *node)
{
    if(node != nullptr)
    {
        Midorder(node->left);
        VISIT(node);    // 访问节点
        Midorder(node->right);
    }
}

对于下图的中序遍历, 我们遍历的顺序就是 D, B, J, E, A, H, F, I, C, G.

11AA11BB1100DD0011EE0000JJ0011CC1111FF1100HH0000II0000GG00HeadHead

接下来, 我们以此图来构造出一个线索二叉树, 构造线索二叉树只有两个原则:

prior 是中序遍历序列中的当前节点的前一个节点, 比如 A的prior 就是 E 节点,

  1. 若当前访问的结点的左指针域为空,则它指向prior指的结点, 同时置该节点 lbit 的值为 0;
  2. 若prior所指结点的右指针域为空,则它指向当前访问的结点, 同时置前驱节点的 rbit 为 0。

因为我们每次都要记录 prior 节点, 因此我们不妨将 prior 设置为全局变量, 这样访问起来较为方便

而构建这个索引的代码, 我们可以在中序遍历的基础上完成:

Tree *prior = *head;

void Mid_order(Tree *node)
{
    if(node != nullptr)
    {
        Mid_order(node->left);
        if(node->left == nullptr)
        {
            node->lbit = 0;
            node->left = prior;
        }
        if(prior->right == nullptr)
        {
            prior->rbit = 0;
            prior->right = node;
        }
        VISIT(node);
        prior = node;
        Mid_order(node->right);
    }
}

假设我们最先访问的是head节点, 及第一个prior 节点是 head 节点. 现在我们构造出了下面这样的线索二叉树,

标签:node,src,wnd,svg,C++,prior,二叉树,线索
来源: https://www.cnblogs.com/wevolf/p/12358171.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有