二叉树声明,遍历,创建

头文件

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

二叉树的声明

typedef struct TNode *Position;
typedef Position BinTree;			//二叉树类型
struct TNode{						//树结点定义
	ElementType Data;				//结点数据
	BinTree Left;					//指向左子树
	BinTree Right;					//指向右子树
}

先序遍历(递归)

void PreorderTraversal(BinTree BT){
	if(BT){
		printf("%d",BT->Data);
		PreorderTravel(BT->Left);
		PreorderTravel(BT->Right);
	}
}

中序遍历(递归)

void InorderTraversal(BinTree BT){
	if(BT){
		InorderTraversal(BT->Left);
		printf("%d",BT->Data);
		InorderTraversal(BT->Right);
	}
}

后序遍历(递归)

void PostTraversal(BinTree BT){
	if(BT){
		PostTraversal(BT->Left);
		PostTraversal(BT->Right)
		printf("%d",BT->Data);
	}
}

中序遍历(迭代)

void InorderTraversal(BinTree BT){
	BinTree T;
	Stcak S = CreateStack();			//创建空堆栈S,元素类型为BinTree
	T=BT;								//从根结点出发
	while( T || !IsEmpty(S)){
		while(T){						//一直向左并将沿途结点压入堆栈
			Push(S,T);
			T=T->Left;
		}
		T=Pop(S);						//结点弹出堆栈
		printf("%d",T->Data);			
		T->Right;
	}
}

层序遍历

void LevelorderTraversal(BinTree BT){
	Queue Q;
	BinTree T;
	
	if(!BT) return;					//若是空树则直接返回

	Q=CreateQueue();				//创建空队列Q
	AddQ(Q,BT);
	while( !IsEmpty(Q) ){
		T=DeleteQ(Q);				//从队列从取出第一个结点,接下来访问并让其左右结点入队
		printf("%d",T->Data);		//访问取出队列的结点
		if(T->Left) AddQ(Q,T->Left);
		if(T->Right) AddQ(Q,T->Right)
	}
}

输出叶结点

void PreorderPrintLeaves(BinTree BT){
	if(BT){
		if( !BT->Left && !BT->Right)
			printf("%d,BT->Data");
		PreorderPrintLeaves(BT->Left);
		PreorderPrintLeaves(BT->Right);
	}
}

输出树的高度

int GetTreeHeight(BinTree BT){
	int HL,HR,MaxH;
	if(BT){
		HL=GetTreeHeight(BT->Left);			//求左子树的高度
		HR=GetTreeHeight(BT->Right);		//求右子树的高度
		MaxH= HL>HR ? HL:HR;				
		return(MaxH+1);
	}
	else return 0;
}

层序生成二叉树

typedef int ElementType;
#define Noinfo 0;

BinTree CreateBinTree(){
	Queue Q;
	ElementType Data;
	BinTree T,BT;

	T=BT;											//保留BT,为了返回根结点
	Q=CreateQueue();
	/*先用BT,来构造根结点*/
	scanf("%d",&Data);
	if(Data!=Noinfo){														
		BT=(BinTree)malloc(sizeof(struct TNode));
		BT->Data=Data;					
		BT->Left=BT->Right=NULL;
		AddQ(Q,BT)
	}
	else	
		return NULL;
	/*之后用T,来操作*/
	while(!IsEmpty(Q)){
		T=DeleteQ(Q);
		//左孩子
		scanf("%d",&Data);
		if(Data != Noinfo){
			T->Left=(BinTree)malloc(sizeof(struct TNode));
			T->Left->Data=Data;
			T->Left->Left=T->Left->Right=NULL;
			AddQ(Q,T->Left);
		}
		else T->Left=NULL;
		//右孩子
		scanf("%d",&Data);
		if(Data != Noinfo){
			T->Right=(BinTree)malloc(sizeof(struct TNode));
			T->Right->Data=Data;
			T->Right->Left=T->Right->Right=NULL;
			AddQ(Q,T->Right);
		}
		else return T->Right=NULL;
	}
	return BT;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值