二叉树的创建(非递归)

1、输入:ABD##E##CF#G###(创建二叉树)

2、输出:先序遍历:ABDECFG

         中序遍历:DBEAFGC

         后序遍历:DEBGFCA


#include<bits/stdc++.h>
#include<conio.h>
using namespace std;

typedef struct BiTreeNode{
	char date;
	struct BiTreeNode *lchild;
	struct BiTreeNode *rchild;
}BiTreeNode ,*BiTree;

typedef struct StackNode{
	BiTree tree_node;
	struct StackNode *next;
}TreeNode,*TreeList;

void StackPush(TreeList &S,BiTree node)
{
	TreeList p=new TreeNode;
	p->tree_node=node;
	p->next=S;
	S=p;
}

void StackPop(TreeList &S,BiTree &T)
{
	if(S==NULL)
		return ;
	T=S->tree_node;
	TreeList p=S;
	S=S->next;
	delete p;
}

bool IsEmpty(TreeList s)
{
	return s==NULL?true:false;
}

void CreatBiTree(BiTree &T)
{
	char date;
	date=getchar();
	if(date == '#')
		T=NULL;
	else{
		T=new BiTreeNode;
		T->date=date;
		CreatBiTree(T->lchild);
		CreatBiTree(T->rchild);
	}
}

void F_PreOrderTraverse(BiTree &T)
{
	BiTree q=T;
	if(q==NULL)
		return ;
	TreeList s=NULL;
	while(!IsEmpty(s) || q)
	{
		while(q)
		{
			cout << q->date << " ";
			StackPush(s,q);
			q=q->lchild;
		}
		if(!IsEmpty(s))
		{
			StackPop(s,q);
			
			q=q->rchild;
		}
	}
}
void F_InOrderTraverse(BiTree &T)
{
	BiTree q=T;
	if(q==NULL)
		return ;
	TreeList s=NULL;
	while(!IsEmpty(s) || q)
	{
		while(q)
		{
			StackPush(s,q);
			q=q->lchild;
		}
		if(!IsEmpty(s))
		{
			StackPop(s,q);
			cout << q->date << " ";
			q=q->rchild;
		}
	}
}

void F_PostOrderTraverse(BiTree &T)
{
	if(T==NULL)
		return;
	BiTree Cur,Post;
	Cur=T;
	Post=NULL;
	TreeList s=NULL;
	while(Cur)
	{
		StackPush(s,Cur);
		Cur=Cur->lchild;
	}
	while(!IsEmpty(s))
	{
		StackPop(s,Cur);
		if(Cur->rchild==NULL || Cur->rchild==Post)
		{
			cout << Cur->date << " ";
			Post=Cur;
		}
		else{
			StackPush(s,Cur);
			Cur=Cur->rchild;
			while(Cur)
			{
				StackPush(s,Cur);
				Cur=Cur->lchild;
			}
		}
	}
	
}
int main()
{
	BiTree T=NULL;
	cout << "请输入:";	 
	CreatBiTree(T);
	cout << endl;

	cout << "中序遍历:"; 
	F_InOrderTraverse(T);
	cout << "\n" << endl;
	
	cout << "先序遍历:"; 
	F_PreOrderTraverse(T);
	cout << "\n" << endl;
	
	cout << "后序遍历:";
	F_PostOrderTraverse(T);
	cout << "\n" << endl;
	return 0;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值