数据结构-二叉树(2)
来源:互联网 发布:java 非web工程 log4j 编辑:程序博客网 时间:2024/05/30 23:39
二叉树的遍历和线索化
1、 层次遍历(使用到了队列)
2、 前序遍历(使用递归或不使用递归)
3、 中序遍历(使用递归或不使用递归)
4、 后序遍历(使用递归或不使用递归)
5、 中序线索二叉树
当以二叉链表作为存储结构时,只能找到结点的左、右孩子的信息,而不能直接找到结点在遍历中的前驱和后继信息。要得到这些信息可采用一下两种方法:第一种方法是将二叉树遍历一遍,在遍历过程中可得到结点的前驱和后继,但这种动态访问浪费时间;第二种方法是充分利用二叉链表中的空链域,将遍历过程中结点的前驱、后继信息保存下来。
在有n个结点的二叉链表中共有2n个链域,但只有n-1个有用的非空链域,其余的n+1个链域是空的。我们可以利用剩下的n+1个空链域存放遍历过程中结点的前驱和后继信息。现规定:若结点有左子树,则其LChild域指向其左孩子,否则LChild域指向其前驱结点;如结点有右子树,则其RChild域指向其右孩子,否则RChild域指向其后继结点。
指向前驱和后继结点的指针叫做线索。以这种结构组成的二叉链表作为二叉树的存储结构,叫做线索链表。
#include <iostream>#include <malloc.h>using namespace std;typedef enum{LINK,THREAD} PointerTag;typedef enum{LINK1,THREAD1} PTag;typedef int DataType;typedef struct BTrTree{ PointerTag lTag,rTag; int data; struct BTrTree *LChild,*RChild;}BTreadNode,*BTreadTree;BTreadTree createTreadTree(){ BTreadTree root; int res = 0; scanf("%d",&res); if(res == 0){ root = NULL; }else{ root = (BTreadTree)malloc(sizeof(BTreadNode)); root->data = res; root->lTag = LINK; root->rTag = LINK; printf("%d的左孩子:",root->data); root->LChild = createTreadTree(); printf("%d的右孩子:",root->data); root->RChild = createTreadTree(); } return root;}BTreadTree pre;void initTread(BTreadTree root){ BTreadTree p; p = root; if(p){ initTread(p->LChild); if(!p->LChild){//左孩子是NULL p->lTag = THREAD; p->LChild = pre; } if(!pre->RChild){ pre->rTag = THREAD; pre->RChild = p; } pre = p; initTread(p->RChild); }}//中序线索二叉树BTreadTree inOrderThrTree(BTreadTree root){ BTreadTree thr;//为头结点的的指针 thr = (BTreadTree)malloc(sizeof(BTreadNode)); thr->LChild = root; thr->RChild = thr; pre = thr; initTread(root); pre->rTag = THREAD; pre->RChild = thr; thr->RChild = pre; return thr;}//中序遍历线索二叉树void inTreTravel(BTreadTree thr){ BTreadTree p; p = thr->LChild; while(p!=thr){ while(p->lTag == LINK){ p = p->LChild; } printf("%d,",p->data); while(p->rTag == THREAD && p->RChild != thr){ p = p->RChild; printf("%d,",p->data); } p = p->RChild; }}int main(){ BTreadTree root, thr; printf("先序遍历方式创建二叉树:\n"); root = createTreadTree(); thr = inOrderThrTree(root); printf("中序遍历线索二叉树:\n"); inTreTravel(thr); system("pause"); return 0;}
- 数据结构-二叉树(2)
- 数据结构---二叉树(2)
- 【数据结构】二叉树2
- 数据结构(二叉树)
- 数据结构(二叉树)
- 数据结构之二叉树(2)
- 数据结构复习之二叉树(2)
- 数据结构——二叉树(2)
- 数据结构---树(二叉树)
- 数据结构---二叉树(C#)
- 二叉树(数据结构1)
- 数据结构-二叉树(1)
- 二叉树算法(数据结构)
- 数据结构---二叉树(1)
- 数据结构---二叉树(3)
- 数据结构(6)二叉树
- 数据结构(26)二叉树
- 数据结构(二叉搜索树)
- Latex写参考文献时的几点注意
- LiveAndroid - 不用买手机也能体验 Android 系统
- 2012-2-13
- 多态
- C++实现词典管理程序
- 数据结构-二叉树(2)
- java学习日记1
- iphone利用线程实现数据的加载,并展示在table列表中
- c++中的常量折叠 ,const与define是属于预编译的时候就被解析
- 有符号数转无符号数的扩展问题
- iOS高效开发必备的10款Objective-C类库
- 日积月累-oracle笔记
- what hadoop good at
- 新闻编辑工具 freetextbox的使用方法