二叉树的创建与四种遍历之递归版本

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

#define maxValue 1000
struct binTreeNode{
	int data;
	binTreeNode * left,*right;
};
binTreeNode * root;
/*
	递归创建二叉树,返回根节点指针
	输入要求:类似先根遍历的输入顺序,如果哪个节点的孩子为空,那么输入0
	例如针对
				1
			2		3
		4		5 6		7
	输入顺序为:
	1	2	4	0	0	5	0	0	3	6	0	0	7	0	0
	针对			1
			2		3
		4		5 0		7
	输入顺序为:
	1	2	4	0	0	5	0	0	3	0	7	0	0
*/
binTreeNode * recCreateBinTree()
{
	int _data = 0;
	binTreeNode * r;
	scanf("%d",&_data);
	
	if(_data == 0)
		r = NULL;
	else
	{
		r = (binTreeNode*)malloc(sizeof(binTreeNode));
		r->data = _data;
		r->left = recCreateBinTree();
		r->right = recCreateBinTree();
	}
	return r;
}

/*
递归版本的先根遍历
*/
void recPreOrder(binTreeNode *root)
{
	if(root != NULL)
	{
		printf("%d\n",root->data);
		recPreOrder(root->left);
		recPreOrder(root->right);
	}
}
/*
递归版本的中根遍历
*/
void recInOrder(binTreeNode *root)
{
	if(root != NULL)
	{	
		recInOrder(root->left);
		printf("%d\n",root->data);
		recInOrder(root->right);
	}
}
/*
递归版本的后根遍历
*/
void recPostOrder(binTreeNode *root)
{
	if(root != NULL)
	{	
		recPostOrder(root->left);		
		recPostOrder(root->right);
		printf("%d\n",root->data);
	}
}
/*
层次遍历
利用数组模拟队列
但是当元素多于1000时候,不可处理
*/
void leverOrder(binTreeNode * root)
{
	binTreeNode * queue[1000];
	binTreeNode *tmp;
	int head = 0;
	int tail = 0;
	if(root != NULL)
	{
		queue[tail] = root; //队列操作,while前边先压入首元素
		tail ++ ;
		while(tail > head) 
		{
			tmp = queue[head]; //弹出队列头元素
			head ++;
			printf("%d\n",tmp->data); //针对首元素的操作
			//压入后继元素
			if(tmp->left != NULL) 
			{
				queue[tail] = tmp->left;
				tail ++ ;
			}			
			if(tmp->right != NULL)
			{
				queue[tail] = tmp->right;
				tail ++;
			}
		}
	}	
}
/*
层次遍历
利用数组模拟队列
而且利用取余,模拟循环队列
*/
void leverOrder2(binTreeNode * root)
{
	binTreeNode * queue[maxValue];
	binTreeNode *tmp;
	int head = 0;
	int tail = 0;
	if(root != NULL)
	{
		queue[tail] = root; //队列操作,while前边先压入首元素
		tail ++ ;
		while(tail != head) 
		{
			tmp = queue[head]; //弹出队列头元素
			head = (head + 1) % maxValue;
			printf("%d\n",tmp->data); //针对首元素的操作
			
			//压入后继元素
			if(tmp->left != NULL) 
			{
				queue[tail] = tmp->left;
				tail = (tail + 1)% maxValue;
			}			
			if(tmp->right != NULL)
			{
				queue[tail] = tmp->right;
				tail = (tail + 1)% maxValue;
			}
		}
	}	
}
int main()
{
	freopen("in.txt","r",stdin);
	root = recCreateBinTree();
	fclose(stdin);
	printf("preOrder:\n");
	recPreOrder(root);	
	printf("inOrder:\n");
	recInOrder(root);
	printf("postOrder:\n");
	recPostOrder(root);
	printf("leverOrder:\n");
	leverOrder2(root);
	return 0;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值