数据结构实验六

本文介绍了如何使用递归遍历二叉树,包括中序、先序和后序遍历,并提供了算法实现。此外,还讨论了如何计算二叉树的高度、总结点数、叶子结点数和单分支结点数,以及判断两棵二叉树是否相等的方法。在实践中,需要注意输入数据的处理,如在创建多个二叉树时防止程序中断。
摘要由CSDN通过智能技术生成

题目:二叉树的递归遍历及运用

1.中序建立两棵二叉树的二叉链表结构,判断两棵二叉树是否相等,分别求其高度、总结点数目、单分支结点数目、叶结点数目

本程序中用到的所有抽象数据类型的定义
//二叉树的二叉链表存储结构
typedef struct BiTNode{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;//BiTree是指向BiTNode的指针类型
算法思路

1.都是很简单的递归,下面一个个来说

建立二叉树

PS:这里的中序建立是指的给节点赋值的顺序是中序的,输入二叉树是还是用的先序。那么对于这里的先序,中序,后序来说,只是赋值位置的不同而已。
算法:大概是先读一个字符,如果是’#'的话,返回一个NULL,代表空结点;不然的话就创造一个新的结点,去创建它的左子树,data域赋值为ch,创建它的右子树,然后返回这个结点。

BiTree create(){//中序创建 
	char ch;BiTree T;
	scanf("%c",&ch);
	if(ch=='#')	return NULL;
	else{
		T=(BiTree)malloc(sizeof(BiTNode));
		T->lchild=create();
		T->data=ch;
		T->rchild=create();
		return T;
	}
	return T;
}
递归遍历

同上,先序,中序,后序,就只是visit()的位置不同而已。这里是先序。
算法:如果T不为空,访问T中的元素,先序遍历T的左子树,然后先序遍历T的右子树。

//先序遍历
Status PreOrder(BiTree T){
	if(T!=NULL){
		visit(T);
		PreOrder(T->lchild);
		PreOrder(T->rchild);
		return OK;	
	}
}
简单说明:
高度
Status TreeDepth(BiTree T){
	int a,b;
	if(T==NULL)//空结点高度记为0
		return 0;
	else
		a=TreeDepth(T->lchild);//求左右子树的高度
		b=TreeDepth(T->rchild);
	if(a>b)//返回左右子树中更高的那颗的高度+1
		return a+1;
	else
		return b+1;
}
总结点数
/*总结点数*/
int n=0;//全局变量计数
Status AllNode(BiTree T){
	if(T!=NULL){//其实就是遍历一遍,呵呵
		AllNode(T->lchild);
		n++;
		AllNode(T->rchild);
	}
}
叶子结点数
/*叶子结点数目*/ 
Status LeadNumber(BiTree T){
	if(T==NULL)
		return 0;
	else {//当T不为NULL,没有左右子树的就是叶子结点
		if((!T->lchild&&!T->rchild))
			return 1;
		else//从左子树,右子树中找叶子结点
			return (LeadNumber(T->lchild)+LeadNumber(T->rchild)); 
	}
}
单分支结点数
/*单分支结点数目*/
Status SingleChildNode(BiTree T){
	if(T==NULL)
		return 0;
	else if((T->lchild&&!T->rchild)||(!T->lchild&&T->rchild))//左右孩子其中只有一个有
		return (SingleChildNode(T->lchild)+SingleChildNode(T->rchild)+1);//返回左右子树的单分支结点数+1
	else//从左子树,右子树中找单分支结点
		return (SingleChildNode(T->lchild)+SingleChildNode(T->rchild));
}
判断两树是否相等
Status Is_SameTree(BiTree A,BiTree B){
	if(A==NULL&&B==NULL)//结点的有无判断
			return TURE;
	else if(A!=NULL&&B==NULL)
			return FALSE;
	else if(A==NULL&&B==NULL)
			return FALSE;
	if(A->data==B->data)//data域的判断,返回左子树是否相等与上右子树是否相等
			return (Is_SameTree(A->lchild,B->lchild)&Is_SameTree(A->rchild,B->rchild));
	else
			return FALSE; 
} 
结束

Q:创建第一个二叉树之后,无法创建第二个二叉树。
A:在主函数两个create()之间加一个getchar()。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值