线索二叉树
(大题绝对不可能出,在工业界没有任何用处)
当一个结点的左孩子指针或者右孩子指针是空着的,线索二叉树就是不让结点的左右孩子指针空着
头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
结构体
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是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。
memset(arr[i], 0, sizeof(ThreadNode));
arr[i]->data = 'A' + i;
}
arr[0]->lchild = arr[1];
arr[0]->rchild = arr[2];
arr[1]->lchild = arr[3];
arr[2]->lchild = arr[4];
T = arr[0];
}
void InThread(ThreadTree& p, ThreadTree& pre)
{
if (p != NULL)
{
//
InThread(p->lchild, pre);
if (p->lchild == NULL)//左边为NULL
{
p->lchild = pre;
p->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL)
{
//pre节点右孩子为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(ThreadNode* p)
{
while (p->ltag == 0)
p = p->lchild;
return p;
}
主函数
int main()
{
ThreadTree T;
ThreadTree p;
BulidThreadTree(T);
CreateInThread(T);//构建线索二叉树
p = Firstnode(T);
printf("最左下节点值为:%c\n", p->data);
system("pause");
}