树的操作

1、无序树的操作

#include <stdio.h>
#include <stdlib.h>

struct bitTree
{
	char data;
	int times;   //用于非递归的后续遍历计数用
	struct bitTree *rtree;
	struct bitTree *ltree;
};

typedef struct bitTree BitTree;

//1、创建树
BitTree* create_node(char data)
{
	BitTree* newnode = (BitTree*) malloc(sizeof(BitTree));
	if(!newnode)
	{
		puts("malloc failed!");
		exit(-1);
	}
	else
	{
		newnode->data = data;
		newnode->ltree = NULL;
		newnode->rtree = NULL;
		
		return newnode;
	}
}

//2、插入节点
void insert_node(BitTree* cur, BitTree* lnode, BitTree* rnode)
{	
	cur->ltree = lnode;
	cur->rtree = rnode;
}

void print(BitTree *curnode)
{
	putchar(curnode->data);
	putchar('\t');
}

//3、递归遍历
void front_traverse(BitTree* tree)  //前序
{
	if(tree == NULL)
		return;
	else
	{	
		print(tree);
		front_traverse(tree->ltree);
		front_traverse(tree->rtree);	
	}
}
void mid_traverse(BitTree * tree)   //中序
{
	if(tree == NULL)
		return;
	else
	{
		mid_traverse(tree->ltree);
		print(tree);
		mid_traverse(tree->rtree);
	}
}
void rear_traverse(BitTree * tree)  //后序
{
	if(tree == NULL)
		return;
	else
	{
		rear_traverse(tree->ltree);
		rear_traverse(tree->rtree);
		print(tree);
	}
}

//非递归中序遍历,用栈实现
void traverse_mid(BitTree* root)			
{
	if(root == NULL)
		return;

	BitTree * stack[20];	//预定义栈大小
	int top = 0;
	BitTree * move = root;
	
	while(top != 0 || move)
	{
		while(move != NULL)	            //寻找最后一个左子数
		{
			stack[top++] = move;      //入栈
			move = move->ltree;       //遍历左子树
		}
		if(top != 0)                  //栈非空,取栈顶元素
		{
			move = stack[--top];      //栈顶元素
			printf("%c\t", move->data);
			move = move->rtree;       //遍历右树
		}
	}
}
//非递归前序遍历
void traverse_front(BitTree* root)
{
	if(root == NULL)
		return;

	BitTree *stack[20];	//预定义栈大小
	int top = 0;
	BitTree * move = root;
	
	while(top != 0 || move)
	{
		while(move != NULL)	//寻找最后一个左子数
		{
			printf("%c\t",move->data);
			stack[top++] = move;            //入栈
			move = move->ltree;             //遍历左子树
		}
		
		if(top != 0)                        //栈非空
		{
			move = stack[--top];            //栈顶元素
			move = move->rtree;             //遍历右树
		}
	}
}
//非递归后续遍历
void traverse_rear(BitTree* root)
{
	if(root == NULL)
		return;

	BitTree *stack[20];	//预定义栈大小
	int top = 0;
	BitTree * move = root;
	
	while(top != 0 || move != NULL)
	{
		while(move != NULL)	//寻找最后一个左子树
		{
			move->times = 1;              //节点首次被访问
			stack[top++] = move;          //入栈
			move = move->ltree;           //遍历左子树
		}	
		if(top != 0)                      //栈非空
		{
			move = stack[--top];		  //取栈顶元素
			if(move->times == 1)		  //右树未遍历
			{
				move->times++;			  //第一次出现在栈顶
				stack[top++] = move;	  //重新入栈
				move = move->rtree;		  //遍历右树
			}
			else if(move->times == 2)		//第二次出现在栈顶,左右树均遍历完毕
			{
				printf("%c\t",move->data);		
				move = NULL;                //
			}
		}		
	}
}

int main()
{
	//创建节点
	BitTree * A = create_node('A');
	BitTree * B = create_node('B');
	BitTree * C = create_node('C');
	BitTree * D = create_node('D');
	BitTree * E = create_node('E');
	BitTree * F = create_node('F');			
	BitTree * G = create_node('G');	
	BitTree * K = create_node('K');
	//连接成树
	insert_node(A,B,C);
	insert_node(B,D,E);
	insert_node(C,F,G);
	insert_node(F,NULL,K);
	//遍历树
	front_traverse(A);      //递归
	putchar(10);
	traverse_front(A);      //非递归
	putchar(10);
	
	mid_traverse(A);        //递归
	putchar(10);
	traverse_mid(A);        //非递归
	putchar(10);
	
	rear_traverse(A);       //递归
	putchar(10);
	traverse_rear(A);       //非递归
	putchar(10);
	
	return 0;
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值