线索二叉树(建立与输出)

线索二叉树的介绍

遍历二叉树的过程就是沿着某一条搜索路径对二叉树中结点进行一次且仅一次的访问。而将访问的结点依次排列成一个线性序列之后,就可以通过这个线性序列对二叉树进行访问,此时就可以将二叉树视为线性结构进行访问(先序遍历,中序遍历等等得到的线性序列不同)。为此,可以在二叉链表的结点中再加上两个指针域,分别存放指向“前驱”和“后驱”的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树。相应的存储结构称为线索链表

线索链表中的结点结构定义如下:

typedef struct BiThrNode {
	char data;
	struct BiThrNode *lchild, *rchild;  //左,右指针
	struct BiThrNode *pred, *succ;    //前驱,后继线索
}BiThrNode, *BiThrTree;

建立线索二叉树并遍历线索链表输出

以中序遍历为例建立线索二叉树的步骤如下:1,建立普通的二叉树(可以采用先序,中序,后序等路径)2,建立二叉树之后对其进行遍历(可以采用先序,中序,后续等路径),建立(对应的)线索链表。建立链表的时候需要遍历函数建表函数。遍历函数按照左根右进行递归,对于根的操作是通过以前以后两个指针,将其之间搭上联系,形成线索。建表函数就是建立头结点,然后调用遍历函数对二叉树进行全部遍历,同时线索化,最后再将尾结点与头结点相连。3,通过建立好的中序线索链表,对二叉树进行中序遍历。

#include<stdio.h>

typedef struct BiThrNode {
	char data;
	struct BiThrNode *lchild, *rchild;  //左,右指针
	struct BiThrNode *pred, *succ;    //前驱,后继线索
}BiThrNode, *BiThrTree;

//建立二叉树
void CreateBiTree(BiThrTree &T)
{
	char c;
	scanf("%c", &c);
	if (c == ' ')
	{  //如果是第一次输入,输入空格则表示这是一个空树,如果是后面递归调用时输入的空格,则说明T->l(r)child是NULL
		T = NULL;
	}
	else      //输入的是具体数值,则开辟新结点将数据输入进入data域,并且对其左右孩子指针进行递归操作
	{
		T = new BiThrNode;
		T->data = c;
		CreateBiTree(T->lchild);     //按照先序遍历的路径进行建立,所以这三行的顺序是固定的
		CreateBiTree(T->rchild);     //同时用户必须按照先序遍历的顺序进行输入
	}
}

void visit(char c)
{
	printf("%c\n", c);
}
void InOrder(BiThrTree H)
{
	//H为指向中序线索链表中头结点的指针,本算法中序遍历以H->lchild所指结点为根的二叉树
	BiThrNode *p;
	p = H->succ;
	while (p != H)
	{
		visit(p->data);
		p = p->succ;
	}
}

void InThreading(BiThrTree p, BiThrTree &pre)
{
	//对以根指针p所指二叉树进行中序遍历,在遍历过程中进行线索化
	//p为当前指针,pre为跟随指针,比p慢一拍遍历整个二叉树
	if (p)
	{
		InThreading(p->lchild, pre);     //左子树线索化
		pre->succ = p;
		p->pred = pre;      //这两步是建立线索,就是将两个结点链接在一起
		pre = p;
		InThreading(p->rchild, pre);     //右子树线索化
	}
}

void InOrderThreading(BiThrTree &H, BiThrTree T)
{
	//建立根指针T所指二叉树的中序全线索链表,H指向该线索链表的头结点
	BiThrNode *pre;
	H = new BiThrNode;   //创建线索链表的头结点
	H->lchild = T;
	H->rchild = NULL;
	if (!T)
	{
		H->pred = H;
		H->succ = H;     //空树头结点的线索指向头结点本身
	}
	else
	{
		pre = H;
		InThreading(T, pre);    //对线索二叉树进行中序遍历,遍历过程中进行线索化
		pre->succ = H;
		H->pred = pre;
	}
}

void main()
{
	BiThrTree T = NULL;
	BiThrTree H = NULL;     //H指向线索链表的头结点
	CreateBiTree(T);    //建立二叉树
	InOrderThreading(H, T);
	InOrder(H); 
}

本笔记所依据的教材为严薇敏版的《数据结构及应用算法教程》

所有代码在Visual Studio 2017上均可正常运行

如有错误欢迎指出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值