二叉树(2)——基本操作

#include<iostream>
using namespace std;
const int step=20;
//二叉链表
struct BiTree
{
	char data;
	struct BiTree *LChild,*RChild;
};
//栈
struct Stack
{
	struct BiTree *base;
	struct BiTree *top;
	int stacksize;
};
//初始化栈
void InitStack(struct Stack &s)
{
	s.base=(struct BiTree*)malloc(step*sizeof(struct BiTree));
	if(!s.base)
		exit(1);
	s.top=s.base;
	s.stacksize=step;
}
//压栈
void push(struct Stack &S,struct BiTree T)
{
	if(S.top-S.base>=S.stacksize)
	{
		S.base=(struct BiTree*)realloc(S.base,(S.stacksize+step)*sizeof(struct BiTree));
		if(!S.base)
			exit(1);
		S.top=S.base+S.stacksize;
		S.stacksize+=step;
	}
	*S.top++=T;
}
//出栈
void pop(struct Stack& S,struct BiTree &T)
{
	if(S.top==S.base)
		return;
	T=*--S.top;
}
//获取栈顶元素
bool GetTop(struct Stack S,struct BiTree &T)
{
	if(S.top==S.base)
		return false;
	T=*(S.top-1);
	return true;
}
//判断栈是否为空
bool EmptyStack(struct Stack s)
{
	if (s.base==s.top)
	{
		return true;
	}
	return false;
}
//建立二叉树
void   CreateBiTree(struct BiTree* &T)
{
	char data;
	cin>>data;
	if (data=='#')
	{
		T=NULL;
	}
	else
	{
		T=new struct BiTree;
		T->data=data;
		CreateBiTree(T->LChild);
		CreateBiTree(T->RChild);
	} 
}
//先序
void   PreOrderTraverse(struct BiTree *T)
{
	if (T)
	{
		printf("%c\n",T->data);
		PreOrderTraverse(T->LChild);
		PreOrderTraverse(T->RChild);
	}
}
//中序
//中序建立待考证
/*void CreateBiTreeByInOrder(struct BiTree* &T)
{
	char data;
	cin>>data;
	if (data=='#')
	{
		T=NULL;
	}
	else
	{
		
		CreateBiTreeByInOrder(T->LChild);
		T=new struct BiTree;
		T->data=data;
		CreateBiTreeByInOrder(T->RChild);
	} 
}*/
void InOrderTraverse(struct BiTree* T)
{
	if (T)
	{
		InOrderTraverse(T->LChild);
		printf("%c\n",T->data);
		InOrderTraverse(T->RChild);
	}
}

//非递归中序——空指针进栈
//此函数空节点入栈存在问题
/*void NNInOrderTraverse(struct BiTree *T)
{
	struct BiTree *P=T;
	struct Stack S;
	InitStack(S);
	push(S,*P);
	while (!EmptyStack(S))
	{
		while (GetTop(S,*P) && P!=NULL)
		{
			push(S,*P->LChild);
			P=P->LChild;
		}
		pop(S,*P);
		if (!EmptyStack(S))
		{
			pop(S,*P);
			printf("%c\n",P->data);
			push(S,*P->RChild);
		}
	}
}*/
//空指针不进栈
void NInOrderTraverse(struct BiTree *T)
{
	struct BiTree *P=T;
	struct Stack S;
	InitStack(S); 
	while (P||!EmptyStack(S))
	{
		if (P)
		{
			push(S,*P);
			P=P->LChild;
		}
		else 
		{
			P=(struct BiTree*)malloc(sizeof(struct BiTree));
			pop(S,*P);
			printf("%c\n",P->data);
			P=P->RChild;
		}
	}
}
//后序遍历
void PostOrderTraverse(struct BiTree*T)
{
	if(T)
	{
		PostOrderTraverse(T->LChild);
		PostOrderTraverse(T->RChild);
		printf("%c\n",T->data);
	}
}
 
int main()
{
	struct BiTree *T;
	CreateBiTree(T); 
	//PreOrderTraverse(T);
	//InOrderTraverse(T);
	//PostOrderTraverse(T);
	NInOrderTraverse(T);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值