非递归前中后序遍历二叉树

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
写在前面:
    最近准备找工作,捡起原来学习过的各种知识,加上一些自己的理解,梳理一下流程,巩固自己的认识,一步两步,一步两步。。。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
二叉树的遍历是树操作的基础,一般的前中后序递归遍历比较简单,这里就不列出了,主要是非递归实现,不GG,直接上代码

一、test.cpp文件
#include <stdio.h>
#include <malloc.h>
#include "order.h"
#include "stdlib.h"

//创建树的时候注意,依次输入:
//比如,一棵3个节点的完全二叉树输入为:ab空格空格c空格空格回车
int create_BitTree(BitTree &T)
{
	char temp;
	scanf("%c",&temp);
	
	if(temp==' ')
	{
		T=NULL;
		//printf("create_BitTree is 0\n");
	}
	else
	{
		if (!(T=(BitTree)malloc(sizeof(BitNode))))
		{
			printf("create_BitTree is wrong\n");
			exit(1);
		}
		T->data = temp;
		create_BitTree(T->leftchild);
		create_BitTree(T->rightchild);

	}
	return 1;
}


int main(void)
{
	BitTree t;
	create_BitTree(t);
	printf("create_BitTree is ok\n");
	pre_order(t,pre_order_print_char);
	in_order(t,in_order_print_char);
	post_order(t,post_order_print_char);
	
}

二、order.cpp文件
#include "order.h"
#include "stdio.h"
#include "stdlib.h"
#include <string.h>


//先序遍历
void pre_order(BitTree T,void (*visit)(TElemType e))
{
	Stack ss;
	init_stack(ss); //初始化栈
	BitTree p=T;

	printf("先序非递归遍历为:\n");
	while ( p || !stack_is_empty(ss))
	{
		if( p )
		{
			visit(p->data);
			push_stack(ss,p);
			p = p->leftchild;
		}
		else
		{
			pop_stack(ss,p);
			p = p ->rightchild;
		}

	}


}

//中序遍历
void in_order(BitTree T,void (*visit)(TElemType e))
{
	Stack ss;
	BitTree p=T;

	init_stack(ss);
	printf("\n中序非递归遍历为:\n");
	while (p||!stack_is_empty(ss))
	{
		if (p)
		{
			push_stack(ss,p);
			p = p ->leftchild;
		}
		else
		{
			pop_stack(ss,p);
			visit(p->data);
			p = p ->rightchild;
		}
	}

}


//后序遍历
void post_order(BitTree T,void (*visit)(TElemType e))
{
	BitTree p=T,pre,temp2;
	BitNode temp;
	Stack ss;
	init_stack(ss);
	printf("\n后序非递归遍历为:\n");
	while (p || !stack_is_empty(ss))
	{
		if (p)
		{
			push_stack(ss,p);
			p = p->leftchild;
		}
		else
		{
			temp2 = get_top_stack(ss);
			if (!temp2->rightchild || temp2->rightchild==pre)//后面个条件表示右子树已经扫描过了
			{
				pop_stack(ss,p);
				visit(p->data);//输出
				pre=temp2;
				p = NULL;
			}
			else
			{
				p = temp2->rightchild;
			}
		}


	}

}

void init_stack(Stack &s)
{
	s.base=(BitTree*)malloc(sizeof(BitTree)*STACK_INIT_SIZE);
	memset(s.base, 0, sizeof(BitTree)*STACK_INIT_SIZE);
	if (!s.base)
	{
		printf("init_stack is wrong");
		exit(1);//退出
	}
	
	s.top=s.base;
	s.stack_size=STACK_INIT_SIZE;
}

int stack_is_empty(Stack s)
{
	if (s.top==s.base)
	{
		return 1;
	}
	else
		return 0;
}

void push_stack(Stack &s, BitTree t)
{
	if (s.top-s.base>=s.stack_size)
	{
		s.base=(BitTree*)realloc(s.base,sizeof(BitTree)*(STACK_INIT_SIZE*2));//分配更大的空间
	}
	*s.top++ = t;
}

void pop_stack(Stack &s,BitTree	&t)
{
	if (s.top==s.base)
	{
		printf("pop_stack is wrong");
		exit(1);//退出
	}
	t=*--s.top;
//	printf("%c",t->data);
	
	
}

BitTree get_top_stack(Stack s)
{
	if (s.top-s.base>0)
	{
		return *--s.top;
	}
	else
		exit(1);
}
void pre_order_print_char(TElemType CC)
{
	printf("%c -> ",CC);
}

void in_order_print_char(TElemType CC)
{
	printf("%c -> ",CC);
}

void post_order_print_char(TElemType CC)
{
	printf("%c -> ",CC);
}

三、order.h文件
#ifndef ORDER_H
#define ORDER_H
#define STACK_INIT_SIZE 30
typedef char TElemType;


typedef struct Node
{
	TElemType data;
	struct Node *leftchild,*rightchild;
}BitNode,*BitTree;

typedef struct stack
{
	BitTree *top;
	BitTree *base;
	int stack_size;
}Stack;

typedef void (*visit)(TElemType);	//定义一个函数指针类型 
void pre_order(BitTree T,void (*visit)(TElemType e));
void in_order(BitTree T,void (*visit)(TElemType e));
void post_order(BitTree T,void (*visit)(TElemType e));

void pre_order_print_char(TElemType CC);
void in_order_print_char(TElemType CC);
void post_order_print_char(TElemType CC);
BitTree get_top_stack(Stack s);
void printChar(TElemType CC);
void init_stack(Stack &s);
void push_stack(Stack &s, BitTree t);
void pop_stack(Stack &s,BitTree	&t);
int stack_is_empty(Stack s);
#endif

四、测试
用网上的一个例子作为程序的输入

输入的时候:ABD空格空格EH空格空格空格CF空格I空格空格G空格空格

五、运行结果:


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值