使用二叉链表实现二叉树的基本操作

#include
#include 
#define MAXSIZE 100
using namespace std;

int count1=0;
int count2=0;

typedef struct BiNode{
	char data;//数据域 
	struct BiNode *lchild, *rchild;//左右子树指针 
}BiTNode, *BiTree;

//先序遍历创建二叉链,输入:ABC##DE#G##F### (#表示树为空)
void CreateBTree(BiTree &T){
	char ch;
	scanf("%c", &ch);
	if(ch=='#'){
		T=NULL;
	}else{
		T=new BiNode;
		T->data=ch;
		CreateBTree(T->lchild);
		CreateBTree(T->rchild);
	}
} 

//先序遍历二叉树的递归方法 
void TraveBiTreeFirstRoot(BiTree &T) {
	if(T){
		printf("%c", T->data);
		TraveBiTreeFirstRoot(T->lchild);
		TraveBiTreeFirstRoot(T->rchild);
	}
} 

/*复制二叉树 
申请一个新的结点,复制根结点;
递归复制左子树;
递归复制右子树。 
*/
void CopyBiTree(BiTree &T, BiTree &NewT){
	if(T==NULL){
		NewT=NULL;
		return;
	}
	NewT=new BiNode;
	NewT->data=T->data;
	CopyBiTree(T->lchild, NewT->lchild);
	CopyBiTree(T->rchild, NewT->rchild);
}

/*
树的深度为树的结点的最大层次,树的深度为树的左右子树深度最大值加1: 
如果是空树,深度为0;
 m为做子树的深度;
 n为右子树的深度;
 树的深度为m和n中的最大值加1 
*/
int Depth(BiTree &T){
	int m=0;
	int n=0;
	if(T==NULL){
		return 0;
	}
	m=Depth(T->lchild);
	n=Depth(T->rchild);
	return m>n? (m+1) : (n+1);
}

/*
统计二叉树的结点数
二叉树的结点数=左子树结点数+右子树结点数+1 
*/ 
int NodeCont(BiTree &T){
	if(T==NULL){
		return 0;
	} 
	return NodeCont(T->lchild)+NodeCont(T->rchild)+1;
}

/*
统计二叉树叶子(度为0)结点数 
若树为空,叶子结点数为0;
若树只有根结点,叶子结点数为1;
递归左子树;
递归右子树; 
*/
int NodeCount0(BiTree &T){
	if(T==NULL){
		return 0;
	}
	if(T->lchild==NULL && T->rchild==NULL){
		return 1;
	}else{
		return NodeCount0(T->lchild)+NodeCount0(T->rchild);
	}
}

/*
统计二叉树度为1的结点数 
若树为空或只有根结点,返回0;
递归左子树;
递归右子树; 
*/
int NodeCount1(BiTree &T){
	if(T==NULL){
		return 0;
	}
	if((T->lchild && !T->rchild) || (!T->lchild && T->rchild)){
		count1=count1+1;
	}
	NodeCount1(T->lchild);
	NodeCount1(T->rchild);
}

/*
统计二叉树度为2的结点数:
若为空树或只有根结点,则返回0;
递归左子树;
递归右子树; 
*/
int NodeCount2(BiTree &T){
	if(T==NULL){
		return 0;
	} 
	if(T->lchild && T->rchild){
		count2=count2+1;
	}
	NodeCount2(T->lchild);
	NodeCount2(T->rchild);
} 

int main(){
	BiTree T;
	printf("输入二叉树的结点,先序遍历的顺序创建二链表:\n");
	CreateBTree(T);
	printf("先序遍历二叉树:\n");
	TraveBiTreeFirstRoot(T);
	printf("\n");
	
	BiTree NewT;
	CopyBiTree(T, NewT);
	printf("遍历复制的二叉树:\n");
	TraveBiTreeFirstRoot(NewT);
	printf("\n");
	
	
	int depth=Depth(T);
	printf("树的深度:%d\n", depth);
	
	int nodeCount=NodeCont(T);
	printf("二叉树结点数:%d\n", nodeCount); 
	
	int count0=NodeCount0(T);
	printf("二叉树的叶子结点数:%d\n", count0);
	
	NodeCount1(T);
	printf("二叉树中度为1的结点数:%d\n", count1);
	
	//int count2=0;
	NodeCount2(T);
	printf("二叉树中度为2的结点数:%d\n", count2);
} 

使用二叉链表实现二叉树的基本操作_第1张图片

使用二叉链表实现二叉树的基本操作_第2张图片

你可能感兴趣的:(数据结构)