二叉树遍历及计算高度(层序遍历在下一章)

/*
	二叉树ADT的实现(基于链式存储) 
	二叉树的特点:(设结点度为0,1,2的结点个数分别为:n0,n1,n2) 
		1,每个结点最多只有两个子树;
		2,n0-1 = n2 ;
		3,边的个数为 n0+n1+n2-1;  
		4, 结点总数为n的二叉树最少高度为 ,以2为底的log(n+1)上取整 
	结构体需求:
		数据域,指针域(左右孩子指针)
	功能实现:
		二叉树的基本操作	
*/ 
#include <stdio.h>
#include <stdlib.h>

#define End 0 //输入的数据域为该值时,表示空结点 
typedef int TElemType;//数据域类型 

typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;	
}BiTNode,*BiTree;

//方法体
	//创,要注意的一点是,每次递归进入该方法的树的根节点已经被创建好,所以不需要再建 
	BiTree CreateBiTree(BiTree &T){ 
		TElemType in;//新插入的结点数据 
		scanf("%d",&in);
		if(in == End){ //输入的结点值为end,则为空结点 
			T = NULL;
		}else{//输入的值非空,则创建新节点插入到父节点的对应位置 
			T = (BiTNode *)malloc(sizeof(BiTNode));
			//使用前序遍历依次插入后序所有孩子结点 
			T->data = in;
			CreateBiTree(T->lchild);
			CreateBiTree(T->rchild);
		}
		return T;//返回当前树的根节点 
	} 
	
	
	
	//查 
	//各类遍历 
	void InOrderTraserval(BiTree T){//中序遍历该二叉树 
		if(T!=NULL){
			InOrderTraserval(T->lchild);
			printf("%d   ",T->data);
			InOrderTraserval(T->rchild);
		}
	}
	
	void PreOrderTraserval(BiTree T){//前序遍历该二叉树 
		if(T!=NULL){
			printf("%d   ",T->data);
			PreOrderTraserval(T->lchild);
			PreOrderTraserval(T->rchild);
		}
	}	
	
	void LastOrderTraserval(BiTree T){//后序遍历该二叉树 
		if(T!=NULL){
			LastOrderTraserval(T->lchild);
			LastOrderTraserval(T->rchild);
			printf("%d   ",T->data);
		}
	}
	
	//树的最大高度 (应使用递归,依次判断各节点左右子树的最大深度) 
	int HighBiTree(BiTree T){
		if(T==NULL){//若该结点为叶子结点,则返回1个深度 
			return 0;
		}else if(T->lchild!=NULL){
			return HighBiTree(T->lchild)+1;
		}else if(T->rchild!=NULL){
			return HighBiTree(T->rchild)+1;
		}else if(T->lchild==NULL&&T->rchild==NULL&&T!=NULL){
			return  1;
		}
	}
	 
	 
	
	
int main(){
	BiTree T;
	CreateBiTree(T);
	
	printf("\n该二叉树中序遍历为:\n");
	InOrderTraserval(T);
	
	printf("\n该二叉树前序遍历为:\n");
	PreOrderTraserval(T);
	
	printf("\n该二叉树后序遍历为:\n");
	LastOrderTraserval(T);

	printf("\n树高为%d!\n",HighBiTree(T));
	
}	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值