线索二叉树创建及删除

题目描述

线索二叉树概念

1.定义

 n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为”线索”)。

这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。

注意:

 线索链表解决了二叉链表找左、右孩子困难的问题,出现了无法直接找到该结点在某种遍历序列中的前趋和后继结点的问题。

2.线索链表的结点结构

 线索链表中的结点结构为:

其中:

 ltag和rtag是增加的两个标志域,用来区分结点的左、右指针域是指向其左、右孩子的指针,还是指向其前趋或后继的线索。

下面你的任务:首先根据输入的序列建立二叉树,然后对二叉树进行线索化,最后中序遍历二叉线索树并输出结果。

输入要求

输入的第一行包含单独的一个数字T,表示测试序列的数目;

以下每一行为一个测试序列,测试序列是按先序序列输入字符 ,如果节点没有左或右孩子,则输入用空格表示,最后用一个空格结束一行的输入。

输出要求

对应每个测试序列,采用中序遍历二叉线索树,输出一行

假如输入

2
ABC  DE G  F
-+a  *b  -c  d  /e  f   

应当输出

CBEGDFA

a+b*c-d-e/f

写了个线索二叉树

Code:

#include<bits/stdc++.h>
using namespace std;
typedef struct BTree
{
    char data;
    struct BTree *left,*right;
    int ltag,rtag;
}BTree;
BTree *CreatBTree()
{
    char ch=getchar();
    if(ch==‘ ‘)
        return NULL;
    BTree *temp=(BTree *)malloc(sizeof(BTree));
    temp->data=ch;
    temp->ltag=temp->rtag=0;
    temp->left=CreatBTree();
    temp->right=CreatBTree();
    return temp;
}
void inThread(BTree *p,BTree *&pre)
{
    if(p)
    {
        inThread(p->left,pre);
        if(!p->left)
        {
            p->left=pre;
            p->ltag=1;
        }
        if(pre&&!pre->right)
        {
            pre->right=p;
            pre->rtag=1;
        }
        pre=p;
        inThread(p->right,pre);
    }
}
void CreateInThread(BTree *T)
{
    BTree *pre=NULL;
    if(T)
    {
        inThread(T,pre);
        pre->right=NULL;
        pre->rtag=1;
    }
}
BTree *first(BTree *p)
{
    while(p->ltag==0)
        p=p->left;
    return p;
}

BTree *next(BTree *p)
{
    if(p->rtag==0)
        return first(p->right);
    else
        return p->right;
}
void inOrder(BTree *T)
{
    for(BTree *p=first(T);p!=NULL;p=next(p))
        cout<<p->data;
}
void delBTree(BTree *T)
{
    BTree *pre=first(T);
    BTree *p=next(pre);
    for(;p!=NULL;pre=p,p=next(p))
        free(pre);
    free(pre);
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        getchar();//吃掉回车
        BTree *root=CreatBTree();
        getchar();//吃掉最后结尾的空格
        CreateInThread(root);
        inOrder(root);
        cout<<endl;
        delBTree(root);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 02:56:23

线索二叉树创建及删除的相关文章

中序线索二叉树创建及其遍历

通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数.准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个.如下图所示. 因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点.这种指针称为线索. 记ptr指向二叉链表中的一个结点,以下是建立线索的规则: (1)如果ptr->lchild为空,则存放指向中序遍历序列中该结点的前驱结点.这个结点称为ptr的中序前驱: (2)如果ptr->rchild为空,则存放指向中序遍历

二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树

定义 二叉树(binary tree)是n(n>=0)个结点的有限集合,该集合为空集合称为空二叉树,或者有一个根结点和两棵互不相交的,分别称为树根结点的左孩子树和右孩子树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树总没有度大于2的结点 左子树和右子树是有顺序的,次数不能任意颠倒 即使树中某结点只有一棵子树,也要区分是左子树还是右子树 特殊的二叉树 1. 斜树 所有的结点都只有左子树的二叉树称为左斜树; 所有的结点都只有右子树的二叉树称为右斜树; 这两者统称为斜树 2. 满二叉树 在一

线索二叉树实例(前序创建,中序遍历)--2018.5.15

#include <stdio.h> #include <stdlib.h> #define ERROR 0 #define OK 1 typedef enum{Link, Thread} PointerTag; //link = 0表示指向左右孩子指针 //Thread = 1表示指向前驱或后继的线索 typedef struct BitNode { char data; //结点数据 struct BitNode *lchild; //左右孩子指针 struct BitNode

小堆 线索二叉树补充

1.小堆: 堆的构造,i>数组直接生成堆(向下调整),iii>插入创建堆(向上调整): (1).怎么实现一次调整? 找到最后一个非叶子结点,n/2-1:一直往下调整即可! (2)堆排----->优先级队列 堆的删除,只能是堆顶元素,再拿最后一个元素补充上去.在向下做一次调整.形成新的堆结构(满足堆的性质),将删除的数字输出就是堆排. 小堆:根(父)小于左右结点:最小的数字先出: 大堆:根(父)大于左右结点:最大的数字先出:   因而,进行堆排是就是优先级队列! 2.线索二叉树的查找父结点

笔试算法题(41):线索二叉树(Threaded Binary Tree)

出题:线索二叉树(Threaded Binary Tree) 分析: 为除第一个节点外的每个节点添加一个指向其前驱节点的指针,为除最后一个节点外的每个节点添加一个指向其后续节点的指针,通过这些额外的指针可以某种遍历方式对二叉树进行遍历,而加了这些额外指针的二叉树就是线索二叉树: 对于含有N个节点的二叉树而言,一共有2N个指针,但除了根节点的其他节点都有来自其父节点的指针,所以耗用了N-1个指针,则最终剩下2N-(N- 1)=N+1个空指针:线索二叉树就是利用这些空指针存储具有某种遍历顺序的前驱和

线索二叉树的基本操作

//定义数据类型 typedef enum{Link, Thread} PointerTag;      //link = 0表示指向左右孩子指针,Thread = 1表示指向前驱或后继的线索 typedef struct BitNode { char data;                              //结点数据 struct BitNode *lchild;                 //左右孩子指针 struct BitNode *rchild; PointerT

二叉树之线索二叉树

相对于顺序存储结构而言,利用链式存储结构的二叉树已经有了很高的存储效率,单是还是有空间上未利用到的地方,比如说叶子结点的左右孩子是空的,指向左右孩子的指针就是空闲的,没有被利用到:而且,有时候给定一个结点,我们需要查找该结点的前驱结点和后继结点,如果按照中序遍历的做法去查找的话,对于一个非叶子结点,其前驱和后继结点查找可以以下算法: 1.preNode=node.left;//前去结点就是该结点的左孩子 2.subNode=search(node.right)://后继结点是该结点的右子树的最左

数据结构之---C语言实现线索二叉树

//线索二叉树,这里在二叉树的基础上增加了线索化 //杨鑫 #include <stdio.h> #include <stdlib.h> typedef char ElemType; typedef enum {Link,Thread} childTag; //Link表示结点.Thread表示线索 typedef struct bitNode { ElemType data; struct bitNode *lchild, *rchild; int ltag, rtag; } b

一步一步写数据结构(线索二叉树)

线索二叉树,在原始二叉树的基础上对节点进行“扩容”,使之变成了一颗节点信息更加丰富,利用率更高的二叉树.具体来说增加了两个指示标签,ltag和rtag,每个标签有两个值,1和0,0代表存在孩子,指针指向相应孩子,1代表没有对应的孩子,指针表示线索,指向其前驱或后继.这样虽然节点多占用了空间(其实很少,只是两个枚举常量而已),换来的却是让原来结构中存在的大量空指针利用起来,变成线索,指示前驱后继,从而使得空间利用效率大大提高, 并且有了线索以后,对后续的查找等操作提高很多效率. 下面是代码,本来以