⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binarytree.cpp

📁 二叉树的遍历操作
💻 CPP
字号:
#include "Operater Declare.h"

void CreateBinTree(BinTree &T)
{
	//按照先序次序的递归建立二叉树操作
	TElemType ch;
	scanf("%c",&ch);
	if(ch==' ')
	{
		T=NULL;
	}
	else
	{
		if(!(T=(BinTree)malloc(sizeof(BiTNode)))) 
		{
			exit(OVERFLOW);
		}
		T->data=ch;
		CreateBinTree(T->lchild);
		CreateBinTree(T->rchild);
	}
	return;
}

//-------遍历操作------
void PreOrderTraverse(BinTree T)
{
	//先序遍历
	//操作结果:输出二叉树中各个节点的值
	if(T)
	{
		printf("%c ",T->data);
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);

	}
	return;
}

void InOrderTraverse(BinTree T)
{
	//中序遍历
	//操作结果:输出二叉树中各个节点的值
	if(T)
	{
		InOrderTraverse(T->lchild);
		printf("%c ",T->data);
		InOrderTraverse(T->rchild);

	}
	return;
}

void PostOrderTraverse(BinTree T)
{
	//后序遍历
	//操作结果:输出二叉树中各个节点的值
	if(T)
	{
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		printf("%c ",T->data);
	}
	return;
}

void LevelOrderTraverse(BinTree T)
{
	//层次遍历
	LinkQueue q;
	QElemType a;
	if(T)
	{
		InitQueue(q);
		EnQueue(q,T);
		while(!QueueEmpty(q))
		{
			DeQueue(q,a);
			printf("%c ",a->data);
			if(a->lchild)
				EnQueue(q,a->lchild);
			if(a->rchild)
				EnQueue(q,a->rchild);
		}
	}
	return;
}

void PreOrderTraverseRE(BinTree T)
{
	SqStack S;
	BinTree p;
	InitStack(S);
	p=T;
	while(p || !StackEmpty(S))
	{
		if(p)
		{
			printf("%c ",p->data);
			Push(S,p);
			p=p->lchild;
		}
		else
		{
			Pop(S,p);
			p=p->rchild;
		}
	}
	printf("\n");
	return;		
}

void InOrderTraverseRE(BinTree T)
{
	//中序非递归遍历
	SqStack S;
	BinTree p;
	InitStack(S);
	p=T;
	while(p || !StackEmpty(S))
	{
		if(p)
		{
			Push(S,p);	
			p=p->lchild;
		}
		else
		{
			Pop(S,p);
			printf("%c ",p->data);
			p=p->rchild;
		}
	}
	printf("\n");
	return;
}

void PostOrderTraverseRE(BinTree T)
{
	//后序非递归遍历
	BinTree p;
	SqStack S;
	InitStack(S);
	p=T;
	p->mark=zero;
	Push(S,p);//根结点进栈
	while(! StackEmpty(S))
	{
		Pop(S,p);
		switch(p->mark)
		{
		case 0:
			p->mark=one;
			Push(S,p);
			if(p->lchild)
			{
				p=p->lchild;
				p->mark=zero;
				Push(S,p);  //访问左子树
			}
			break;

		case 1:
			p->mark=two;
			Push(S,p);
			if(p->rchild)
			{
				p=p->rchild;
				p->mark=zero;
				Push(S,p);  //访问右子树
			
			}
			break;

		case 2:
			printf("%c ",p->data);


		}

	}
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -