树和二叉树4——定位结点值为 x 的二叉树结点的层次

本文介绍了一种在二叉树中查找特定结点值及其所在层次的方法,提供了详细的C语言实现代码,包括树的创建、遍历及销毁等过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:定位二叉树 bt 中结点值为 x 的结点及其所在的层次。
这里只定位了层次,求路径请看下一篇文章:树和二叉树5

核心代码如下:

int Location_x(BiTree t,char x)
{	
	static int level=0;	
	if(t)
	{
		if(t->data==x) 
		{
			printf("\n结点值为x的结点层次为:%d",level+1);
			flag1=0; 
		}  			
		level++;
		Location_x(t->lchild,x);	
		Location_x(t->rchild,x);	
		level--;
	}
	if(!level&&flag1) 
	printf("\n找不到符合要求的结点"); 
} 

完整代码如下:

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

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

int BiTreedestroy(BiTree &t)
{
	if(t)
	{
		if(t->lchild)
			BiTreedestroy(t->lchild);
		if(t->rchild)
			BiTreedestroy(t->rchild);
		free(t);
		t=NULL;
	}
	return 1;
}

void BiTreecreate(BiTree &t)
{
	char ch;
	char pch[]="ABD$$EHJ$$KL$$M$N$$$CF$$G$I$$";
	static int i=0;
	ch=pch[i++];
	
	if(ch=='$')
	t=NULL;
	else 
	{
		t=(BiTree)malloc(sizeof(BiTNode));
		if(!t)   exit(-1);
		t->data=ch;
		BiTreecreate(t->lchild);
		BiTreecreate(t->rchild); 
	}
}

int flag=1; 
void pre_order_traveral_brackets1(BiTree t)
{  
	if(t)
	{
		printf("%c",t->data);
		if(t->lchild||t->rchild)
		{
			printf("(");flag++;
		}		
		pre_order_traveral_brackets1(t->lchild);
		if(t->rchild)
		printf(",");
		pre_order_traveral_brackets1(t->rchild);
	}
}
void pre_order_traveral_brackets(BiTree t)
{   
	if(t)
	{
		printf("%c",t->data); 
		printf("(");
		pre_order_traveral_brackets1(t->lchild);
		while(--flag)
		{
			printf(")");
		}
		printf(",");
		pre_order_traveral_brackets1(t->rchild);
		while(flag--+1)
		{
			printf(")");
		}
	}
}

int max(int a,int b)
{
	return a>b?a:b;
}

int flag1=1;
int location_x(BiTree t,char x,int lever)
{		
	if(t)
	{
		if(t->data==x)   
		{
			printf("\n结点值为x的结点层次为:%d",lever);
			flag1=0;
		}
		lever++;
		location_x(t->lchild,x,lever);	
		location_x(t->rchild,x,lever);	
		lever--;
	}
	if(lever==1&&flag1)//如果这里level用静态变量倒也不用那么麻烦了 
	printf("\n找不到符合要求的结点"); 
} 

int Location_x(BiTree t,char x)
{	
	static int level=0;	
	if(t)
	{
		if(t->data==x) 
		{
			printf("\n结点值为x的结点层次为:%d",level+1);
			flag1=0; 
		}  			
		level++;
		Location_x(t->lchild,x);	
		Location_x(t->rchild,x);	
		level--;
	}
	if(!level&&flag1) 
	printf("\n找不到符合要求的结点"); 
} 

int main(){

	BiTree binarytree;
	char x='N';
	BiTreecreate(binarytree);
	
	printf("输出二叉树:");
	pre_order_traveral_brackets(binarytree);
    
    Location_x(binarytree,'I');
		
	BiTreedestroy(binarytree);
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值