#include <stdio.h>
#include <stdlib.h>
#include<stack>
#include<queue>
#include<iostream>
#include <math.h>
using namespace std;
typedef char ElemType;
typedef struct ThreadNode { //线索树结构
ElemType data;
struct ThreadNode* lchild, * rchild; //左右孩子指针
int ltag, rtag; //左右线索标志
}ThreadNode, * ThreadTree;
//手工建线索树,总计5个结点
void BulidThreadTree(ThreadTree& T) {
ThreadTree arr[5]; //结构体数组
int i;
for (i = 0; i < 5; i++)
{
arr[i] = (ThreadTree)malloc(sizeof(ThreadNode)); //申请结构体空间
memset(arr[i], 0, sizeof(ThreadNode)); //结构体初始化
arr[i]->data = 'A' + i; //结构体data赋值
}
arr[0]->lchild = arr[1]; //手工建立结构体关系
arr[0]->rchild = arr[2];
arr[1]->rchild = arr[3];
arr[2]->lchild = arr[4];
T = arr[0];
}
void InThread(ThreadTree& p, ThreadTree& pre) { //中序遍历对二叉树线索化
if (p != NULL) { //p不空才递归
InThread(p->lchild, pre); //左子树为空,递归出口,建立当前结点的前驱线索 (递归出口——找位置+函数目的的操作)
if (p->lchild == NULL) {
p->lchild = pre;
p->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL) { //建立前驱结点的后继线索
pre->rchild = p;
pre->rtag = 1;
}
pre = p; //标记当前线索化的结点为刚刚访问过的结点
InThread(p->rchild, pre); //递归线索化右子树
}
}
void CreateInThread(ThreadTree T)
{
ThreadTree pre = NULL;
if (T != NULL) {
InThread(T, pre);
pre->rchild = NULL;
pre->rtag = 1;
}
}
ThreadNode* Firstnode(ThreadTree p) { //求中序线索二叉树中序序列下的第一个结点
while (p->ltag == 0) { p = p->lchild; } //若有左子树,则循环向左下结点
return p;
}
ThreadNode* Nextnode(ThreadTree p) { //求中序线索二叉树中序序列下的第一个结点
if (p->rtag == 0) { return Firstnode(p->rchild); }//右子树非空,返回右子树下中序序列的第一个结点
else return p->rchild; //rtag==1,直接返回后继线索
}
int main() {
ThreadTree T;
ThreadTree p;
BulidThreadTree(T);
CreateInThread(T);
p = Firstnode(T);
cout << "最左下结点值为" << p->data << endl; //中序序列下的第一个结点
system("pause");
}
07-30