`
hao3100590
  • 浏览: 131458 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

线索二叉树

阅读更多

1.算法描述

就是简单的线索二叉树的建立,遍历,查找等基本操作,具体什么是线索二叉树,百度一下!

 

2.算法说明

具体说明有四点:如下图


注:尤其要注意第4点,我在写的时候就没注意这个问题,结果遍历的时候出现了无限循环,找了半天才找到!主要是建立二叉树判断的惯性思维,故而容易出现错误!

 

3.代码实现

头文件

 

#ifndef BITHRTREE_H
#define BITHRTREE_H

enum flag{CHILD, THREAD};//枚举类型,枚举常量Child=0,Thread=1
template<class T>
struct Node{						//二叉线索树的结点结构
	Node<T> *rchild, *lchild;
	int lflag, rflag;
	T data;
};


template<class T>
class BiThrTree{
	public:
		BiThrTree();
		~BiThrTree();
		Node<T>* getRoot( );            //获取根结点
    Node<T>* next(Node<T>* p);   		//查找结点p的中序后继结点
    void inOrder(Node<T>* root);    //中序遍历线索链表
		Node<T>* inPreNode(Node<T>* p); //查找结点p的中序前驱结点
		Node<T>* searchNode(T x);				//查找结点x
		
	private:
		Node<T>* root;        					//指向线索链表的头指针
    void creatThrTree(Node<T>* &root);    		//创建二叉树
    void biThrTree(Node<T>* &root, Node<T>* &pre);  //二叉树的线索化(中序线索二叉树)
    void release(Node<T>* root);    //析构函数调用
};

#endif

 

 bithrtree.cpp

标//<-------------notice------------>就是容易出错的地方!!

 

#include <iostream>
#include "bithrtree.h"
using namespace std;

template<class T>
BiThrTree<T>::BiThrTree(){
	Node<T>* pre = NULL;
	creatThrTree(root);
	biThrTree(root, pre);
}

template<class T>
BiThrTree<T>::~BiThrTree(){
	release(root);
}
		
//获取根结点
template<class T>
Node<T>* BiThrTree<T>::getRoot( ){
	return root;
}  

//查找结点p的中序后继结点   
template<class T>      
Node<T>* BiThrTree<T>::next(Node<T>* p){
	Node<T>* t;
	//如果有右子树,则后继就是右子树的第一个结点最左节点,如果第一个结点没有左子树,则就是右子树第一个结点
	if(p->rflag == CHILD){ //<-------------notice------------> 
		t = p->rchild;
		while(t->lflag == CHILD){//即存在左子树.注:不能使用t->lchild判断,因为二叉树已经线索化,故而也不为空
			t = t->lchild;
		}
		return t;
	}else{
		return p->rchild;
	}
}

//中序遍历线索链表
template<class T>  		
void BiThrTree<T>::inOrder(Node<T>* root){
	if(root){
		//先找到最左的结点
		while(root->lflag == CHILD){//不能是root->lchild<-------------notice------------> 
			root = root->lchild;
		}
		//开始中序遍历
		do{
			cout<<root->data<<" ";
			root = next(root);
		}while(root);
	}
}    

//查找结点p的中序前驱结点
template<class T>
Node<T>* BiThrTree<T>::inPreNode(Node<T>* p){
	Node<T>* t;
	if(p->lflag == THREAD){//<-------------notice------------> 
		return p->lchild;
	}else{
		//如果p有左孩子,那么左孩子的最右结点就是其前驱
		t = p->lchild;
		while(t->rflag == CHILD){//有右孩子(不要用t->rchild)<-------------notice------------> 
			t = t->rchild;
		}
		return t;
	}
}

//查找结点x 
template<class T>
Node<T>* BiThrTree<T>::searchNode(T x){
	Node<T>* t = NULL;
	if(root){
		//先找到最左的结点
		while(root->lflag == CHILD){//<-------------notice------------> 
			root = root->lchild;
		}
		//开始中序遍历
		do{
			if(root->data == x){ 
				t = root;
				break;
			}
			root = next(root);
		}while(root);
	}
	return t;
}		

//创建二叉树
template<class T>
void BiThrTree<T>::creatThrTree(Node<T>* &root){
	T ch;
	cout<<"请输入创建一棵二叉树的结点数据"<<endl;
	cin>>ch;
	if(ch == "#") root = NULL;
	else{
		root = new Node<T>;
		root->data = ch;
		creatThrTree(root->lchild);
		creatThrTree(root->rchild);
	}
}   

//二叉树的线索化(中序线索二叉树)
template<class T> 		
void BiThrTree<T>::biThrTree(Node<T>* &root, Node<T>* &pre){
	if(root){
		biThrTree(root->lchild, pre);
		
		//<--------------------------notice-------------------------> 
		//左孩子处理(lflag和前驱)
		if(!root->lchild){
			root->lflag =  THREAD;
			root->lchild = pre;
		}else{
			root->lflag = CHILD;
		}
		//右孩子处理(rflag不能处理后序,因为还没遍历到)
		if(!root->rchild){
			root->rflag = THREAD;
		}else{
			root->rflag = CHILD;
		}
		//pre的后续(rflag之前已经处理,如果设置为了索引,设置右索引为root)
		if(pre){
			if(pre->rflag == THREAD) pre->rchild = root;
		}
		//<--------------------------notice------------------------->
		
		//记录前驱
		pre = root;
		biThrTree(root->rchild, pre);
	}
}

//析构函数调用
template<class T>
void BiThrTree<T>::release(Node<T>* root){
	if(root){
		release(root->lchild);
		release(root->rchild);
		delete root;
	}
}
 

 

 

 main.cpp

 

#include <iostream>
#include <string>
#include "bithrtree.cpp"
using namespace std;

int main(){
	BiThrTree<string> bt;
	Node<string>* t = bt.getRoot();
	
	cout<<"------中序遍历-------"<<endl;
	bt.inOrder(t);
	cout<<endl;
	
	Node<string>* r;
	cout<<"查找结点b:";
	r = bt.searchNode("b");
	if(r) cout<<r->data<<endl;
	else cout<<"无"<<endl;
	
	cout<<"b的前驱:";
	r = bt.inPreNode(r);
	if(r) cout<<r->data<<endl;
	else cout<<"无"<<endl;
		
	cout<<"a的前驱:";
	r = bt.searchNode("a");
	r = bt.inPreNode(r);
	if(r) cout<<r->data<<endl;
	else cout<<"无"<<endl;
		
	cout<<"d的前驱:";
	r = bt.searchNode("d");
	r = bt.inPreNode(r);
	if(r) cout<<r->data<<endl;
	else cout<<"无"<<endl;
		
	return 0;
}

 

 4.总结

基本上只要明白了二叉树的基本原理,线索二叉树就非常的简单,就多了一个线索化的过程,简化了搜索前序和后继结点的时间,提高了效率!

如果有什么不对的地方,欢迎指正!

 

  • 大小: 21.3 KB
分享到:
评论

相关推荐

    线索二叉树(数据结构课设)

    线索二叉树是一种特殊形式的二叉树,它在二叉链表的基础上增加了线索,用于在树中进行更高效的前序、中序和后序遍历。这种数据结构在计算机科学,尤其是数据结构课程中占有重要地位,因为它能有效地解决非递归遍历的...

    线索二叉树的建立、删除、插入、恢复线索

    线索二叉树可以分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。在本文中,我们将讨论中序线索二叉树的建立、删除、插入和恢复线索。 一、线索二叉树的建立 线索二叉树的建立可以通过遍历二叉树并将每个...

    C++线索二叉树类实现

    线索二叉树是一种特殊的二叉树结构,它在二叉链表的基础上增加了线索,以便于在非递归情况下进行前序、中序和后序遍历。在C++中实现线索二叉树需要理解二叉树的基本概念以及链式存储结构。本文将深入探讨线索二叉树...

    中序线索二叉树(建立二叉树,线索化,输出二叉树)

    中序线索二叉树(建立二叉树,线索化,输出二叉树)

    数据结构 线索二叉树

    线索二叉树是一种特殊的二叉树,它是在普通的二叉链表基础上进行改造,以便在二叉树中方便地进行前序、中序和后序遍历。在标准的二叉链表中,每个节点仅包含指向左孩子和右孩子的指针,但没有直接指向其前驱和后继...

    线索二叉树运算的课程设计

    线索二叉树是一种特殊的二叉树数据结构,它通过在二叉链表的空指针域中存储指向结点在特定遍历顺序下的前驱和后继结点的指针,从而方便快速的遍历。在本课程设计中,重点在于实现中序线索二叉树的建立、插入、删除...

    线索二叉树 算法 建立 输出等。。。

    线索二叉树是一种特殊形式的二叉树,它在二叉链表的基础上增加了线索,用于在不使用额外栈或递归的情况下实现前序、中序和后序遍历。这种数据结构在处理大规模数据时非常有用,因为它可以提高查找效率。下面我们将...

    数据结构 线索二叉树 严蔚敏

    线索二叉树是一种为了在非线性数据结构——二叉树中实现快速的前序、中序和后序遍历而设计的数据结构。这个概念由著名计算机科学家严蔚敏教授提出,它通过增加额外的线索(traversing links)来辅助遍历,使得在不...

    数据结构课程设计线索二叉树

    线索二叉树是一种特殊的二叉树,它在二叉链表的基础上增加了线索,使得在非递归情况下也能方便地进行前序、中序和后序遍历。这种数据结构在实际编程中,尤其是在数据结构课程设计中,是学生学习和掌握的重点之一。...

    二叉树的线索化(中序线索二叉树)

    在中序线索二叉树中,我们可以快速地从前一个节点找到后一个节点,而无需通过父节点进行跳转。这一过程涉及到对二叉树节点的修改,添加两个额外的指针,称为“前向线索”(in-order predecessor pointer)和“后向...

    线索二叉树实验报告.docx

    线索二叉树是一种特殊形式的二叉树,它在二叉树的基础上增加了线索,以便于在不使用递归的情况下进行二叉树的遍历。在本实验中,我们使用C语言实现了线索二叉树,主要涉及到以下几个核心知识点: 1. **线索二叉树的...

    数据结构线索二叉树严蔚敏

    在众多的数据结构类型中,线索二叉树是一种特殊形式的二叉搜索树,主要用于提高对二叉树的遍历效率,特别是对于查找前驱和后继节点。这个主题与严蔚敏教授的教材《数据结构》紧密相关,这是一本在中国计算机科学教育...

    线索二叉树的数据结构课程设计

    线索二叉树是一种在二叉树中添加线索(thread)以方便进行遍历的数据结构,主要应用于不支持随机访问的存储系统中。这种数据结构在实际应用中,尤其是在需要高效遍历二叉树(如前序、中序、后序遍历)时,能提供便利...

    线索二叉树详解(C语言版).rar

    线索二叉树是一种在二叉树中添加线索以方便遍历的数据结构,它主要用于实现二叉树的前序、中序和后序遍历。在C语言中,线索二叉树的实现通常涉及到指针的高级操作和结构体的设计。下面我们将详细探讨线索二叉树的...

    数据结构课程设计 线索二叉树

    **线索二叉树**是一种特殊的二叉树结构,它的主要目的是为了方便在二叉树中进行遍历。在普通的二叉树中,我们通常通过递归或者栈来实现前序、中序、后序等遍历方式。但在线索二叉树中,通过在节点的空指针域中存储...

    线索二叉树的建立与实现

    线索二叉树是一种特殊的二叉树结构,它主要用于优化二叉搜索树的查找、插入和删除操作。在普通二叉搜索树中,我们通常通过左指针和右指针来定位节点,但是在某些情况下,例如当我们要进行前序、中序或后序遍历时,...

Global site tag (gtag.js) - Google Analytics