#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxSize 50
//定义线索二叉树(包含三叉链表)
typedef struct ThreadBiTreeNode{
int data;
struct ThreadBiTreeNode *lchild,*rchild,*parent;
int ltag,rtag;
}ThreadBiTreeNode,* ThreadBiTree;
//建立线索二叉树
ThreadBiTree createThreadBiTree(){
ThreadBiTree T = NULL;
int data;
scanf("%d",&data);
if(data != 99999){
T = (ThreadBiTree)malloc(sizeof(ThreadBiTreeNode));
T->data = data;
T->ltag = 0;
T->rtag = 0;
T->lchild = createThreadBiTree();
if(T->lchild != NULL)
T->lchild->parent = T;
T->rchild = createThreadBiTree();
if(T->rchild != NULL)
T->rchild->parent = T;
}
return T;
}
//先序线索化
//先序遍历:根 左 右
//算法思想:首先传入一个指针p,指向当前结点。一个指针pre,指向当前结点的前驱
//将整棵树先先序遍历一遍,得到结点的访问顺序。
//判断p指向的当前结点是否有左孩子,若有:p->ltag = 0; 若没有:p->lchild = pre; p->ltag = 1;
//然后再判断pre是否有右孩子,若有:pre->rtag = 0; 若没有: pre->rchild = p; pre->rtag = 1;
//按照被访问的顺序 找前驱和后继
//先序,后续线索化,可能发生“爱的魔力转圈圈”现象
void PreThread(ThreadBiTree &p,ThreadBiTree &pre){
if(p){
if(p->lchild == NULL){ //根
p->lchild = pre;
p->ltag = 1;
}
if(pre && pre->rchild == NULL){
线索二叉树的先中后序线索化以及找它们的前驱、后继
于 2022-10-14 19:00:13 首次发布