#include <stdio.h>
#include<stdlib.h>
#include <conio.h>
#include <string.h>
typedef char DataType;
typedef struct node
{
DataType data; // 数据域
int ltag, rtag; // 线索标记
struct node *lchild, *rchild; // 左,右孩子
}BiTnode;
typedef BiTnode * BinTree;
/*
// 创建二叉树 参数接收为数组
void CreateBiTree(BinTree *T,char *&s,int &i)
{
char ch = s[i];
if (ch == '#')
{
*T = NULL;
}
else
{
*T = (BiTnode *)malloc(sizeof(BiTnode));
(*T)->data = ch;
i++;
printf(" 字符%c\n",ch);
CreateBiTree(&(*T)->lchild,s,i); //建立左子树
i++;
CreateBiTree(&(*T)->rchild,s,i); //建立右子数
}
}
*/
// 创建二叉树 参数接收为数组
void CreateBiTree(BinTree *T, char *&s)
{
char ch = *s;
if (ch == '#')
{
*T = NULL;
}
else
{
*T = (BiTnode *)malloc(sizeof(BiTnode));
//memset(&T, 0, sizeof(BiTnode *));
(*T)->data = ch;
s++;
CreateBiTree(&(*T)->lchild, s); //建立左子树
s++;
CreateBiTree(&(*T)->rchild, s); //建立右子数
}
}
// 访问节点
void visit(char c, int level)
{
printf("%c位于第%d 层\n", c, level);
}
// 先序遍历
void PreOrderTraver(BinTree T, int level)
{
if (T)
{
visit(T->data, level);
PreOrderTraver(T->lchild, level + 1);
PreOrderTraver(T->rchild, level + 1);
}
}
// 二叉树查找字符‘B’ 位置 ,并指向此节点
void search(BinTree p, BinTree &q, char ch)
{
if (p!=NULL)
{
if (p->data == ch)
{
q = p;
}
else {
search(p->lchild, q, ch);
if(q==NULL)
{
search(p->rchild, q, ch);
}
}
}
}
// 中序遍历二叉树线索化算法
void InThread(BinTree p,BinTree &pre)
{
if (p != NULL)
{
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 createInThred(BinTree root)
{
// BinTree pre = (BiTnode *)malloc(sizeof(BiTnode));
BinTree pre = NULL;
if (root != NULL)
{
InThread(root, pre);
pre->rchild = NULL;
pre->rtag = 1;
}
}
void MenuTitle()
{
// 菜单显示
printf("请根据菜单选择所需要的操作\n");
printf("\t\t\t 1. 搜索 ‘B’ 节点 ,指向B节点 \t\t\t");
printf("\n\t\t\t 2. 中序线索化 \t\t\t");
printf("\n");
}
void Menushow(BinTree T, char ch)
{
int level = 1;// 层数
switch (ch)
{
case '1':
{
BinTree T1 = (BinTree)malloc(sizeof(BinTree));
search(T, T1, 'B');
printf("先序遍历\n");
PreOrderTraver(T1, level);
getchar();
printf("\n");
break;
}
case '2':
{
createInThred(T);
getchar();
printf("\n");
break;
}
default:
break;
}
}
int main() {
char s[] = "AB#D##CE###";
char *p = s;
int level = 1;// 层数
BinTree T = NULL;
//CreateBiTree(&T,p,i);
// 先序列创建二叉数
CreateBiTree(&T, p);
// 先序遍历
printf("先序遍历\n");
PreOrderTraver(T, level);
printf("\n");
while(1){
// 提示
MenuTitle();
printf("请输入选择:");
char ch = getchar();
Menushow(T,ch);
//getchar();
}
return 0;
}
效果图如下: