二叉树的遍历和线索化
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;
}