二叉树的简单操作

最近在做二叉树题目,所以总结一些比较简单的处理方法。

以下是输入的数据,#视为空

A##
ABC####
AB##C##
ABCD###EF##G###
A##B##
ABC##D##EG###

#include<iostream>
using namespace std;
#include<cstdio>
#include<cstdlib>
char *ch;
typedef struct node
{
    char data;
    struct node *lc;
    struct node *rc;
}BT,*Bi;
//二叉树的先序创建:百度到的基本都是在输入一个字符之后创建一个孩子节点,但是题目是多组输入,以下的代码是先将字符存在一个数组中,逐个取数,注:上面已经定义了全局变量字符ch。
void create(Bi &T)
{
	if(*ch++=='#')
		T=NULL;
	else
	{
		T=(BT*)malloc(sizeof(BT));
		T->data=*(ch-1);
		create(T->lc);
		create(T->rc);
	}
}


//二叉树统计宽度:
int width(BT *t)
{
	if(t->lc==NULL&&t->rc==NULL) return 1;
	else
	{
		int l=0,r=0;
		if(t->lc!=NULL) l=width(t->lc);
		if(t->rc!=NULL) r=width(t->rc);
		return l+r;
	}
}
//	二叉树统计高度:
int heigh(BT *t)
{
	int lc,rc;
	if(t==NULL)
		return 0;
	else 
	{
		lc=heigh(t->lc);
		rc=heigh(t->rc);
		return (lc>rc)?(lc+1):(rc+1);
	}
}
//以下是遍历操作(非递归算法太麻烦了):
//二叉树的先序遍历:
void preorder(BT *t)
{
	if(t!=NULL)
	{
		printf("%c",t->data);
		preorder(t->lc);
		preorder(t->rc);
	}
}
//中序遍历:
void inorder(BT *t)
{
	if(t!=NULL)
	{
		inorder(t->lc);
		printf("%c",t->data);
		inorder(t->rc);
	}
}
//后序遍历:
void postorder(BT *t)
{
	if(t!=NULL)
	{
		postorder(t->lc);
		postorder(t->rc);
		printf("%c",t->data);
		
	}
	
}
//层次遍历:
void levelorder(BT *t)
{
	BT *p;
	BT *qu[1000];
	int front,rear;
	front=rear=-1;
	rear++;
	qu[rear]=t;
	while(front!=rear)
	{
		front=(front+1)%1000;
		p=qu[front];
		printf("%c",p->data);
		if(p->lc!=NULL)
		{
			rear=(rear+1)%1000;
			qu[rear]=p->lc;
		}
		if(p->rc!=NULL)
		{
			rear=(rear+1)%1000;
			qu[rear]=p->rc;
		}
	}
}
int main()
{
	char str[100];
	scanf("%s",str);
	ch=str;
	BT *t;
	create(t);
	printf("%d\n",width(t));
	printf("%d\n",	heigh(t));
	preorder(t);
	inorder(t);
	postorder(t);
	levelorder(t);
	return 0;
}






注:遍历操作参考于:李春葆编著,数据结构教程.北京.清华大学出版社,2013.1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值