数据结构二叉树代码(非递归前中后序遍历,中序线索化)

这篇博客详细介绍了如何使用C++实现数据结构中的二叉树,包括非递归方式的前序、中序、后序遍历以及中序线索化的操作,涉及到的主要函数和代码实现分别在不同的文件中定义和实现。
摘要由CSDN通过智能技术生成

主函数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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值