首页 > 其他分享 >线索二叉树

线索二叉树

时间:2024-03-02 19:55:05浏览次数:19  
标签:pre lchild ThreadTree ThreadNode 二叉树 rchild NULL 线索

线索二叉树即从前、中、后序三种遍历中其中一种来看,树中的左右孩子都不会是空着的,都会指向对应的前驱和后驱。
以中序遍历为例,二叉树线索化过程如下:
先是树的结构

typedef struct ThreadNode{
    Elemetype data;
    struct ThreadNode *lchild,*rchild;
    int ltag,rtag;
}ThreadNode,*ThreadTree;
void InThread(ThreadTree &p,ThreadTree &pre){//记录当前节点和前驱节点
    if(p!=NULL){
        InThread(p->lchild,pre);//先看左子树
        if(p->lchild==NULL){//对左孩子进行修改
            p->lchild=pre;
            p->ltag = 1;
        }
        if(pre!=NULL&&pre->rchild==NULL){//对右孩子进行修改
            pre->rchild=p;
            pre->rtag=1;
        }
        pre = p;//在下次搜索前及时修改前驱
        InThread(p->rchild,pre);//看右子树
    }
}

将树进行线索化

void CreateInThread(ThreadTree T){
    ThreadTree pre = NULL;
    if(T!=NULL){
        InThread(T,pre);
        pre->rchild = NULL;
        pre->rtag = 1;//对最后一个节点进行修改
    }
}

接下来是遍历线索树

ThreadNode *Firstnode(ThreadNode *p){
    while(p->ltag==0) p = p->lchild;
    return p;
}//找出左下第一个节点

ThreadNode *Nextnode(ThreadNode *p){
    if(p->rtag = 0) return Firstnode(p->rchild);
    else return p->rchild;
}//寻找下一个节点

void vist(ThreadNode *p){
    printf("%d",p->data);
}

void Inorder(ThreadNode *T){
    for(ThreadNode *p = Firstnode(T);p!=NULL;p = Nextnode(p))
        vist(p);
}

标签:pre,lchild,ThreadTree,ThreadNode,二叉树,rchild,NULL,线索
From: https://www.cnblogs.com/humanplug/p/18049144

相关文章

  • DFS在二叉树上的表现
    原题跳转:洛谷B3642二叉树的遍历题目内容:二叉树的遍历题目描述有一个\(n(n\le10^6)\)个结点的二叉树。给出每个结点的两个子结点编号(均不超过\(n\)),建立一棵二叉树(根节点的编号为\(1\)),如果是叶子结点,则输入00。建好树这棵二叉树之后,依次求出它的前序、中序、后序列遍......
  • 不同序构造二叉树
    一、根据前序与中序构造二叉树前序遍历:确定根节点root,最左端的节点即为根节点中序遍历:确定根节点左右两边的节点,通过计算左右两边节点集合的大小对root左节点集合与右节点集合执行重复操作,不断确定小集合的根节点,最终可构造出一整棵二叉树树的存储可以采用定义类或结构体,这......
  • 94. 二叉树的中序遍历c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/voidinorder(structTre......
  • 145. 二叉树的后序遍历c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/voidpostorder(structT......
  • 144. 二叉树的前序遍历c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/voidpreorder(structTr......
  • leedcode 二叉树的前序遍历
    递归法:classSolution:def__init__(self):#初始化一个实例变量res用于存储前序遍历结果self.res=[]defpreorderTraversal(self,root:Optional[TreeNode])->List[int]:#如果根节点存在ifroot:#检查根......
  • 平衡二叉树
    平衡二叉树特点:任意节点左右子树的高度不超过1反例:10节点的左子树高度为0,右子树高度为3这是平衡二叉树这也是平衡二叉树如何保持平衡添加一个节点后,该树不再是平衡二叉树-》旋转左旋,多余左节点做右节点复杂的左旋10的多余左节点9。给予前父节点7作为右节......
  • 二叉树查找树遍历
    二叉树查找树遍历存放规则:小的存左边、大的存右边、一样的不存前序、中序、后序指的是当前结点的顺序前序:当前结点、左子节点、右子节点中序:左子节点、当前节点、右子节点后序:左子节点、右子节点、当前结点前序遍历中左右遍历完左树遍历右树从上到下,根节点->从左......
  • 二叉树
    cal的题目分类说到二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容再啰嗦一遍,所以以下我讲的都是一些比较重点的内容。相信只要耐心看完,都会有所收获。C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时......
  • 二叉树
    二叉树概念二叉树是一种特殊的树,每次分叉不超过两部分。结构根节点如果一个结点没有子树,那就称为叶子结点。左子树右子树完美二叉树如果一个二叉树的高度为h,从第二层开始每层结点树都是上一层的两倍。左子树2*x(根节点)右子树2*x(根节点)+1二叉树的遍历前序......