主函数main
//#include"BiTreenode.h"
#include"Linknode.h"
SqBitreeptr make_tree1();
ThreadTreeptr make_tree2();
void main() {
/*
BiTreeptr T = (BiTree*)malloc(sizeof(BiTree));
if (T == NULL)
return;
InitBitree(T);
Showall(*T);
int x;
x = Comm_Ancestor(T, 10, 23);
printf("%d ", x);
*/
SqBitreeptr S=NULL;
// 手工构造一课树
/*
1
2 3
4 5 6 7
8
*/
S = make_tree1();
//visit(S);
Preorder2(S);
Preorder(S);
//printf("\n");
//Postorder(S);
//printf("\n");
//Postorder2(S);
/*
ThreadTreeptr S2 = NULL;
ThreadTreeptr pre = NULL;
S2 = make_tree2();
//InThread(S2, pre);
//CreateInThread(&S2);
S2 = InThread(S2, pre);
visit(S2->lchild->lchild->lchild->rchild->rchild);
*/
}
SqBitreeptr make_tree1() {
SqBitreeptr S8 = (SqBitree*)malloc(sizeof(SqBitree));
S8->data = 8, S8->lchild = NULL, S8->rchild = NULL;
SqBitreeptr S7 = (SqBitree*)malloc(sizeof(SqBitree));
S7->data = 7, S7->lchild = NULL, S7->rchild = NULL;
SqBitreeptr S6 = (SqBitree*)malloc(sizeof(SqBitree));
S6->data = 6, S6->lchild = NULL, S6->rchild = NULL;
SqBitreeptr S5 = (SqBitree*)malloc(sizeof(SqBitree));
S5->data = 5, S5->lchild = NULL, S5->rchild = NULL;
SqBitreeptr S4 = (SqBitree*)malloc(sizeof(SqBitree));
S4->data = 4, S4->lchild = S8, S4->rchild = NULL;
SqBitreeptr S3 = (SqBitree*)malloc(sizeof(SqBitree));
S3->data = 3, S3->lchild = S6, S3->rchild = S7;
SqBitreeptr S2 = (SqBitree*)malloc(sizeof(SqBitree));
S2->data = 2, S2->lchild = S4, S2->rchild = S5;
SqBitreeptr S1 = (SqBitree*)malloc(sizeof(SqBitree));
S1->data = 1, S1->lchild =S2, S1->rchild = S3;
return S1;
}
ThreadTreeptr make_tree2() {
ThreadTreeptr S8 = (ThreadTreeptr)malloc(sizeof(ThreadTree));
S8->data = 8, S8->lchild = NULL, S8->rchild = NULL,S8->rtag=S8->ltag=0;
ThreadTreeptr S7 = (ThreadTreeptr)malloc(sizeof(ThreadTree));
S7->data = 7, S7->lchild = NULL, S7->rchild = NULL, S7->rtag = S7->ltag = 0;
ThreadTreeptr S6 = (ThreadTreeptr)malloc(sizeof(ThreadTree));
S6->data = 6, S6->lchild = NULL, S6->rchild = NULL, S6->rtag = S6->ltag = 0;
ThreadTreeptr S5 = (ThreadTreeptr)malloc(sizeof(ThreadTree));
S5->data = 5, S5->lchild = NULL, S5->rchild = NULL, S5->rtag = S5->ltag = 0;
ThreadTreeptr S4 = (ThreadTreeptr)malloc(sizeof(ThreadTree));
S4->data = 4, S4->lchild = S8, S4->rchild = NULL, S4->rtag = S4->ltag = 0;
ThreadTreeptr S3 = (ThreadTreeptr)malloc(sizeof(ThreadTree));
S3->data = 3, S3->lchild = S6, S3->rchild = S7, S3->rtag = S3->ltag = 0;
ThreadTreeptr S2 = (ThreadTreeptr)malloc(sizeof(ThreadTree));
S2->data = 2, S2->lchild = S4, S2->rchild = S5, S2->rtag = S2->ltag = 0;
ThreadTreeptr S1 = (ThreadTreeptr)malloc(sizeof(ThreadTree));
S1->data = 1, S1->lchild = S2, S1->rchild = S3, S1->rtag = S1->ltag = 0;
return S1;
}
头文件SqTree.h
#include<stdio.h>
#include<stdlib.h>
#pragma once
#define ElemType int
#define bool int
#define MaxSize 50
typedef struct Bitreenode {
ElemType data[MaxSize];
int length;
}BiTree,*BiTreeptr;
// 顺序存储二叉树
void InitBitree(BiTreeptr T);
bool IsEmpty(BiTreeptr T);
bool GetRoot(BiTreeptr T);
ElemType Comm_Ancestor(BiTreeptr T, int i, int j);
void Showall(BiTree T);
void visit1(BiTreeptr T);
头文件Linknode.h
#include<stdio.h>
#include<stdlib.h>
#include"SqBitree.h"
#define bool int
#pragma once
// 栈的链式存储
typedef struct Linknode {
ThreadTree* data;
struct Linknode* next;
}Linknode, * LinknodePtr;
void LinknodeStackmemo(); //定义主函数
void LinkInit(LinknodePtr L); //初始化
bool LinkEmpty(LinknodePtr L);
LinknodePtr LinkPush(LinknodePtr L, ThreadTree* x);
LinknodePtr LinkPop(LinknodePtr L, ThreadTree** x);
bool LinkGetTop(LinknodePtr L, ThreadTree** x);
函数文件SqBiTree.c
#include"Linknode.h"
// 树的函数
void InitSqBitree(SqBitreeptr T) {
return;
}
SqBitreeptr Insert_Sqtree(SqBitreeptr T,ElemType x) {
SqBitreeptr new = (SqBitree*)malloc(sizeof(SqBitree));
if (new == NULL)
return T;
return T;
new->data = x;
new->lchild =new->rchild= NULL;
if (T == NULL) {
T = new;
return T;
}
else {
while (T->lchild!= NULL) {
T = T->lchild;
}
T->lchild = new;
return T;
}
}
void visit(SqBitreeptr T) {
if(T != NULL) {
printf("%d ",T->data);
}
}
void Preorder(SqBitreeptr T) {
if (T != NULL) {
visit(T); //访问根节点
Preorder(T->lchild); //访问左孩子
Preorder(T->rchild); //访问右孩子
}
}
void Inorder(SqBitreeptr T) {
if (T != NULL) {
Inorder(T->lchild);
visit(T);
Inorder(T->rchild);
}
}
void Postorder(SqBitreeptr T) {
if (T != NULL) {
Postorder(T->lchild);
Postorder(T->rchild);
visit(T);
}
}
void Preorder2(SqBitreeptr T) { //非递归先序遍历
Linknode* S=NULL;
SqBitreeptr p = T;
LinkInit(S);
while (p!=NULL || !LinkEmpty(S)) {
if (p!=NULL) {
visit(p); //访问当前根节点
S=LinkPush(S, p); //压入当前根节点
p = p->lchild; //向左走
}
else {
S=LinkPop(S, &p); //弹出当前根节点
p = p->rchild; //向右走
}
}
}
void Inorder2(SqBitreeptr T) { //非递归中序遍历
Linknode* S = NULL;
SqBitreeptr p = T;
LinkInit(S);
while (p || !LinkEmpty(S)) {
if (p) {
S=LinkPush(S, p);
p = p->lchild;
}
else {
S=LinkPop(S, &p);
visit(p);
p = p->rchild;
}
}
}
void Postorder2(SqBitreeptr T) { //非递归后续遍历
Linknode* S = NULL;
SqBitreeptr p = T;
LinkInit(S);
SqBitreeptr r = NULL;
while (p || !LinkEmpty(S)) {
if (p) {
S = LinkPush(S, p); //走到最左边
p = p->lchild;
}
else { //向右走
LinkGetTop(S, &p); //读取栈顶
if (p->rchild && p->rchild != r) { //判断右子树存在且未被访问过
p = p->rchild; //转向右
}
else { //否则弹出栈顶并访问
S = LinkPop(S, &p); //弹出节点
visit(p); //访问节点
r = p; //记录最近访问的节点
p = NULL; //节点访问完毕,重置p指针。
}
}
}
}
ThreadTreeptr InThread(ThreadTreeptr T, ThreadTreeptr pre) { //中序线索化
Linknode* S = NULL;
ThreadTreeptr p = T;
LinkInit(S);
while (p || !LinkEmpty(S)) {
if (p) {
S = LinkPush(S, p);
p = p->lchild;
}
else {
S = LinkPop(S, &p);
if (p->lchild == NULL) {
p->lchild = pre;
p->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL) {
pre->rchild = p;
p->rtag = 1;
}
pre = p;
p = p->rchild;
}
}
pre->rchild = NULL;
pre->rtag = 1;
return T;
}
void Inorder_Thread(ThreadTreeptr T) {
if (T != NULL) {
Inorder_Thread(T->lchild);
visit_Thread(T);
Inorder_Thread(T->rchild);
}
}
void visit_Thread(ThreadTreeptr T) {
if (T != NULL)
printf("%d ", T->data);
}
void InThread1(ThreadTreeptr *T,ThreadTreeptr *pre) {
if (*T != NULL) {
InThread1(&((*T)->lchild), pre);
if ((*T)->lchild == NULL) {
(*T)->lchild = *pre;
(*T)->ltag = 1;
}
if (*pre != NULL && (*pre)->rchild == NULL) {
(*pre)->rchild = *T;
(*pre)->rtag = 1;
}
*pre = *T;
InThread1(&(*T)->rchild, pre);
}
}
void CreateInThread(ThreadTreeptr* T) {
ThreadTreeptr pre = NULL;
if (T != NULL) {
InThread1(T, &pre);
pre->rchild = NULL;
pre->rtag = 1;
}
}
函数文件Linknode.c
#include"Linknode.h"
void LinkInit(LinknodePtr L) //初始化
{
L = NULL;
}
bool LinkEmpty(LinknodePtr L)
{
if (L == NULL)
return 1;
else
return 0;
}
LinknodePtr LinkPush(LinknodePtr L, ThreadTree *x)
{
Linknode* newdata = NULL;
newdata = (Linknode*)malloc(sizeof(Linknode));
if (newdata == NULL)
return L;
newdata->data = x;
if (L == NULL) {
L = newdata;
newdata->next = NULL;
return L;
}
else {
newdata->next = L;
L = newdata;
return L;
}
}
LinknodePtr LinkPop(LinknodePtr L, ThreadTree** x)
{
if (L != NULL) {
*x=L->data;
/*
(*x)->data = L->data->data;
(*x)->lchild = L->data->lchild;
(*x)->rchild = L->data->rchild;
*/
L = L->next;
return L;
}
return L;
}
bool LinkGetTop(LinknodePtr L, ThreadTree** x)
{
if (L != NULL) {
*x = L->data;
return 1;
}
return 0;
}