赞
踩
【问题描述】
建立线索链表,实质上就是将二叉链表中的空指针改为指向前驱或后继的线索,而前驱或后继的信息只有在遍历该二叉树时才能得到。给定扩展二叉树的前序序列,构建二叉树。然后为这棵二叉树建立中序线索链表,并利用线索链表输出中序遍历结果。
【输入形式】
输入扩展二叉树的前序序列。
【输出形式】
利用线索二叉树输出树的中序遍历序列,并且按照中序顺序输出销毁线索二叉树的过程。
【样例输入】
abd#g###ce##f##
【样例输出】
Inorder:dgbaecf
Inorder finished. Calling destructer...
delete d
delete g
delete b
delete a
delete e
delete c
delete f
【题目要求】
要求创建二叉树,然后建立线索链表,必须在规定的代码结构中编写,不能修改主函数。
- /*定义中序线索二叉树
- 运行范例:
- abd#g###ce##f##
- */
- #include<iostream>
- #include<stdio.h>
- using namespace std;
-
- struct ThreadNode
- {
- char data;
- ThreadNode *lchild, *rchild;
- int ltag, rtag;
- };
-
- class ThreadBiTree
- {
- private:
- ThreadNode *root;//指向线索链表的头指针
- public:
-
- ThreadBiTree() //构造函数,建立中序线索链表
- {
- root = NULL;
- root = creat(root);
- inThread(root);
- }
- ~ThreadBiTree(); //析构函数,释放各结点的存储空间
- ThreadNode *next(ThreadNode *p);//查找p的后继
- void inOrder(); //中序遍历线索链表
- private:
- ThreadNode *creat(ThreadNode *bt);
- void destroy(ThreadNode *p); //线索化,由构造函数调用
- void inThread(ThreadNode *p); //线索化,由构造函数调用
- };
-
- //create函数创建二叉树
- ThreadNode *ThreadBiTree::creat(ThreadNode *bt)
- {
- char ch;
- cin>>ch;
- if(ch=='#'){
- bt=NULL;
- }
- else{
- bt=new ThreadNode;
- bt->data=ch;
- bt->ltag=0;
- bt->rtag=0;
- bt->lchild=creat(bt->lchild);
- bt->rchild=creat(bt->rchild);
- }
- return bt;
- }
-
- //实现二叉树线索化,这个函数由构造函数调用
- void ThreadBiTree::inThread(ThreadNode *p)
- {
- static ThreadNode *pre=NULL;
- if(p==NULL){
- return;
- }
- inThread(p->lchild);
- if(p->lchild==NULL){
- p->ltag=1;
- p->lchild=pre;
- }
- if(pre!=NULL){
- pre->rtag=1;
- pre->rchild=p;
- }
- pre=p;
- inThread(p->rchild);
- }
-
- //查找p的后继
- ThreadNode* ThreadBiTree::next(ThreadNode *p)
- {
- ThreadNode *q=NULL;
- if(p->rtag==1){
- q=p->rchild;
- }
- else{
- q=p->rchild;
- while(q->ltag==0){
- q=q->lchild;
- }
- }
- return q;
- }
-
- //中序遍历线索链表
- void ThreadBiTree::inOrder()
- {
- if(root==NULL){
- return;
- }
- ThreadNode *p;
- p=root;
- while(p->ltag==0){
- p=p->lchild;
- }
- cout<<p->data;
- while(p->rchild!=NULL){
- p=next(p);
- cout<<p->data;
- }
- }
-
- //析构函数,释放各结点的存储空间
- ThreadBiTree::~ThreadBiTree()
- {
- destroy(root);
- }
-
- //destroy函数,由析构函数调用销毁结点
- void ThreadBiTree::destroy(ThreadNode *p)
- {
- if(p==NULL){
- return;
- }
- ThreadNode *q=NULL;
- while(p->ltag==0){
- p=p->lchild;
- }
- do{
- q=next(p);
- cout<<"delete "<<p->data<<endl;
- delete p;
- p=q;
- }while(q->rchild!=NULL);
- cout<<"delete "<<p->data;
- delete p;
- }
-
- int main()
- {
- ThreadBiTree tree;
- cout << "Inorder:";
- tree.inOrder();
- cout <<endl<< "Inorder finished. Calling destructer..."<<endl;
- return 0;
- }
推荐哔哩哔哩懒猫老师数据结构“线索二叉树”视频。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。