求二叉树某结点在先序、中序、后序遍历中的访问次序

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	char data;
	struct node *lchild,*rchild;
}*BiT,BiTNode;
void main()
{
	BiT create_BT();
	void PreorderSearch_BT(BiT bt,char e,int &k);
	void MidorderSearch_BT(BiT bt,char e,int &k);
	void LasorderSearch_BT(BiT bt,char e,int &k);
	printf("请输入序列以建立二叉树(空表用#占位):");
	BiT bt;
	bt=create_BT();
	getchar();
	printf("请输入字符(输入@时结束):");
	char ch;
	ch=getchar();
	getchar();
	while(ch!='@')
	{
		int k1=0,k2=0,k3=0;
		PreorderSearch_BT(bt,ch,k1);
		MidorderSearch_BT(bt,ch,k2);
		LasorderSearch_BT(bt,ch,k3);
		if(k1<0||k2<0||k3<0)
			printf("该字符不在二叉树中!重新输入!\n");
		else 
			printf("该字符先序访问次序为:%d\n该字符中序访问次序为:%d\n该字符后序访问次序为:%d\n",k1,k2,k3);
		printf("请输入字符(输入@时结束):");
		ch=getchar();
		getchar();
	}
}

BiT create_BT()
{//基于先序遍历创建一个二叉树
	char ch;
	ch=getchar();
	if(ch=='#')return NULL;
	BiT bt;
	bt=(BiT)malloc(sizeof(BiTNode));
	bt->data=ch;
	bt->lchild=create_BT();
	bt->rchild=create_BT();
	return bt;
}
void PreorderSearch_BT(BiT bt,char e,int &k)
{//先序遍历
	if(!bt||k>0)return;//如果bt是空结点或k大于0,则停止递归
	else
	{
		if(k>0)return;//k>0时,停止递归
		k--;//k先自减一
		if(bt->data==e)
			k=-k;//满足条件时,k反号
		PreorderSearch_BT(bt->lchild,e,k);//向左深入
		PreorderSearch_BT(bt->rchild,e,k);//向右深入
	}
}

void MidorderSearch_BT(BiT bt,char e,int &k)
{
	if(!bt||k>0)return;
	else
	{
		MidorderSearch_BT(bt->lchild,e,k);
		if(k>0)return;
		k--;		
		if(bt->data==e)
			k=-k;
		MidorderSearch_BT(bt->rchild,e,k);
	}
}

void LasorderSearch_BT(BiT bt,char e,int &k)
{
	if(!bt||k>0)return;
	else
	{
		LasorderSearch_BT(bt->lchild,e,k);
		LasorderSearch_BT(bt->rchild,e,k);
		if(k>0)return;	
		k--;
		if(bt->data==e)
			k=-k;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在二叉树的遍历,叶结点是指没有子节点结点。在先序遍历,叶结点是最先遍历的,因为先序遍历先遍历根节点,再遍历左子树,最后遍历右子树。因此,在先序遍历,叶结点的相对次序是最先的。 在中序遍历,叶结点的相对次序在根节点和其他结点之间,因为中序遍历先遍历左子树,再遍历根节点,最后遍历右子树。 在后序遍历,叶结点的相对次序是最后的,因为后序遍历先遍历左子树,再遍历右子树,最后遍历根节点。因此,在后序遍历,叶结点的相对次序是最后的。 ### 回答2: 对于任何一棵二叉树,其叶结点先序中序后序遍历序列的相对次序是相同的。具体来说,假设该二叉树有n个叶结点,对于其任意两个叶结点,它们在先序中序后序遍历序列的相对次序都是相同的。 先序遍历的顺序是根节点,然后左子树和右子树,因此对于任何一个叶结点,它的前面都是其所在子树的根节点和叶结点,而其后面则一定是其同级或者更高级节点的右子树或者向上跳的节点中序遍历的顺序是先左子树,然后根节点和右子树。对于一个叶节点,它前面的是在它左侧的节点,而它后面的是在它右侧的节点后序遍历的顺序是先左子树和右子树,然后根节点。对于一个叶节点,它前面的是在它同侧左边的节点,而它后面的则是在它同侧右边的节点。 因此,可以得出结论是,对于任何一棵二叉树,其叶结点先序中序后序遍历序列的相对次序是相同的。 ### 回答3: 在二叉树先序遍历,第一个遍历的节点一定是根节点,随后按照先左子树后右子树的顺序遍历。当遇到一个叶节点时,遍历就会返回到它父节点的位置,开始遍历父节点的右子树。因此,在先序遍历,叶节点的顺序取决于它们在树出现的先后顺序以及它们所处的深度。 在二叉树中序遍历,根节点被遍历的位置位于间,左边是根节点的左子树,右边是根节点的右子树。因此,对于每个叶节点来说,它们的相对位置取决于它们在树所处的深度。深度越小的节点中序遍历越靠前,深度越大的节点中序遍历越靠后。 在二叉树后序遍历,叶节点是在遍历完左右子树之后才被遍历到的。这意味着,如果一个节点是叶节点,它一定是在它的父节点的左右子树都被遍历完之后才被遍历到的。因此,在后序遍历,叶节点的相对位置与它们在先序中序遍历的顺序不同,而是与它们在树的位置以及它们的深度有关。深度越深的叶节点后序遍历越靠前,深度越浅的叶节点后序遍历越靠后。 综上所述,在不同的遍历方式,叶节点相对位置的顺序都与它们在树的深度和出现位置有关,但是具体的顺序会因为遍历方式不同而产生差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值