- 浏览: 131458 次
- 性别:
- 来自: 成都
最新评论
-
yi_chao_jiang:
你好,多谢分享,问个问题,在上传数据的时候判断文件是否有上传记 ...
断点续传和下载原理分析 -
a41606709:
为什么我的tabhost显示不出来? 怎么设置在全部页面中让他 ...
TabActivity中的Tab标签详细设置 -
Zero颴:
大神篇,思路,配图都很清晰,perfect!
Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解 -
QAZ503602501:
牛死人了!!!
B-树 -
mengsina:
很牛的文档。数学功底好啊
Android Matrix理论与应用详解
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.总结
基本上只要明白了二叉树的基本原理,线索二叉树就非常的简单,就多了一个线索化的过程,简化了搜索前序和后继结点的时间,提高了效率!
如果有什么不对的地方,欢迎指正!
发表评论
-
排序方法总结
2012-08-12 11:34 1176这里面包含了所有常见的排序操作 1.性能等比较分析 2 ... -
常见字符串操作大全
2012-08-12 11:34 14601.常见的字符串操作 如计算长度,求子串等都是考验基本功的, ... -
KMP算法解析
2012-08-12 11:35 2835一.理论基础 1.什么 ... -
二叉堆的实现
2012-08-12 11:35 12101.堆的概念 这里只需要注意两点: a.堆的存储方式:就是 ... -
set和map的简单实现
2012-08-10 11:35 13141.Set的简单实现 set是利用二叉查找树来实现的,而且为 ... -
红黑树的插入总结
2012-08-10 11:25 14051.红黑树 这个在july的博客中有详尽的说明,我就不在赘述 ... -
B-树实现
2012-08-10 11:03 16241.什么是B-树? 这个在我的前一篇博客中已经详细的阐释过: ... -
平衡二叉树
2012-08-10 10:39 28481.问题描述 什么是平衡 ... -
二叉排序树
2012-08-10 10:25 14751.基本概念 二叉排 ... -
B-树
2012-07-04 22:48 56661.B-树的概念 是一种多 ... -
构造哈夫曼树
2012-07-04 10:40 12291.算法说明 就是建造哈夫曼树树,从而使得构造出的树带权路径 ... -
二叉树基本操作大全
2012-07-03 18:22 26031.二叉树的基本操作 这里我有一个疑问: 在使用构造 ... -
多种队列的实现
2012-06-29 10:09 15501.算法描述 a.数据结构与算法(Mark Allen We ... -
栈的各种实现
2012-06-28 16:34 11091.算法描述 a.实现二个栈,在一个数组里面,除非没有任何空 ... -
中缀表达式转换为后缀
2012-06-28 11:10 18251.算法描述 例如a+b*c这是常见的中缀表达式,但是 ... -
后缀表达式的值
2012-06-27 16:33 13321.算法描述 计算后缀表达式的值 2.事例 如:( ... -
Josephus问题
2012-06-21 15:30 9961.算法描述 简单的游戏:有N个人坐成一圈,编号1-N、从编 ... -
关于最长递增子序列的实际应用--动态规划
2012-06-07 11:35 1830参考链接: a.http://www.programfan. ... -
线性查找二维数组
2012-06-05 17:23 10301.算法描述 有序(行有序,列有序,且每行从左至右递增 ... -
整数的随机置换
2012-06-05 15:10 2318算法描述:生成前N个整 ...
相关推荐
线索二叉树是一种特殊形式的二叉树,它在二叉链表的基础上增加了线索,用于在树中进行更高效的前序、中序和后序遍历。这种数据结构在计算机科学,尤其是数据结构课程中占有重要地位,因为它能有效地解决非递归遍历的...
线索二叉树可以分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。在本文中,我们将讨论中序线索二叉树的建立、删除、插入和恢复线索。 一、线索二叉树的建立 线索二叉树的建立可以通过遍历二叉树并将每个...
线索二叉树是一种特殊的二叉树结构,它在二叉链表的基础上增加了线索,以便于在非递归情况下进行前序、中序和后序遍历。在C++中实现线索二叉树需要理解二叉树的基本概念以及链式存储结构。本文将深入探讨线索二叉树...
中序线索二叉树(建立二叉树,线索化,输出二叉树)
线索二叉树是一种特殊的二叉树,它是在普通的二叉链表基础上进行改造,以便在二叉树中方便地进行前序、中序和后序遍历。在标准的二叉链表中,每个节点仅包含指向左孩子和右孩子的指针,但没有直接指向其前驱和后继...
线索二叉树是一种特殊的二叉树数据结构,它通过在二叉链表的空指针域中存储指向结点在特定遍历顺序下的前驱和后继结点的指针,从而方便快速的遍历。在本课程设计中,重点在于实现中序线索二叉树的建立、插入、删除...
线索二叉树是一种特殊形式的二叉树,它在二叉链表的基础上增加了线索,用于在不使用额外栈或递归的情况下实现前序、中序和后序遍历。这种数据结构在处理大规模数据时非常有用,因为它可以提高查找效率。下面我们将...
线索二叉树是一种为了在非线性数据结构——二叉树中实现快速的前序、中序和后序遍历而设计的数据结构。这个概念由著名计算机科学家严蔚敏教授提出,它通过增加额外的线索(traversing links)来辅助遍历,使得在不...
线索二叉树是一种特殊的二叉树,它在二叉链表的基础上增加了线索,使得在非递归情况下也能方便地进行前序、中序和后序遍历。这种数据结构在实际编程中,尤其是在数据结构课程设计中,是学生学习和掌握的重点之一。...
在中序线索二叉树中,我们可以快速地从前一个节点找到后一个节点,而无需通过父节点进行跳转。这一过程涉及到对二叉树节点的修改,添加两个额外的指针,称为“前向线索”(in-order predecessor pointer)和“后向...
线索二叉树是一种特殊形式的二叉树,它在二叉树的基础上增加了线索,以便于在不使用递归的情况下进行二叉树的遍历。在本实验中,我们使用C语言实现了线索二叉树,主要涉及到以下几个核心知识点: 1. **线索二叉树的...
在众多的数据结构类型中,线索二叉树是一种特殊形式的二叉搜索树,主要用于提高对二叉树的遍历效率,特别是对于查找前驱和后继节点。这个主题与严蔚敏教授的教材《数据结构》紧密相关,这是一本在中国计算机科学教育...
线索二叉树是一种在二叉树中添加线索(thread)以方便进行遍历的数据结构,主要应用于不支持随机访问的存储系统中。这种数据结构在实际应用中,尤其是在需要高效遍历二叉树(如前序、中序、后序遍历)时,能提供便利...
线索二叉树是一种在二叉树中添加线索以方便遍历的数据结构,它主要用于实现二叉树的前序、中序和后序遍历。在C语言中,线索二叉树的实现通常涉及到指针的高级操作和结构体的设计。下面我们将详细探讨线索二叉树的...
**线索二叉树**是一种特殊的二叉树结构,它的主要目的是为了方便在二叉树中进行遍历。在普通的二叉树中,我们通常通过递归或者栈来实现前序、中序、后序等遍历方式。但在线索二叉树中,通过在节点的空指针域中存储...
线索二叉树是一种特殊的二叉树结构,它主要用于优化二叉搜索树的查找、插入和删除操作。在普通二叉搜索树中,我们通常通过左指针和右指针来定位节点,但是在某些情况下,例如当我们要进行前序、中序或后序遍历时,...